天天看點

Facade模式(外觀模式)

Facade模式也叫外觀模式,是由GoF提出的23種設計模式中的一種。Facade模式為一組具有類似功能的類群,比如類庫,子系統等等,提供一個一緻的簡單的界面。這個一緻的簡單的界面被稱作facade。

<script type="text/javascript"></script> <script src="http://www.adeeee.com/JS/base.js" type="text/javascript"></script> <script src="http://www.adeeee.com/Link.aspx?WebCode=20090621093833&AdCode=20090617042710&AdSize=20090617050144&AdType=10&Os=Windows NT 5.1&Browser=Other Explorers&Page=http://www.lifevv.com/sysdesign/doc/20071119123529354.html&Tilte=設計模式之Facade - 外觀模式 - 系統設計與模組化"></script>

本文介紹設計模式中的外觀(Facade)模式的概念,用法,以及實際應用中怎麼樣使用Facade模式進行開發。

Facade模式的概念 Facade模式為一組具有類似功能的類群,比如類庫,子系統等等,提供一個一緻的簡單的界面。這個一緻的簡單的界面被稱作facade。

在應用系統中,為了實作某具有複雜功能的子產品或子系統等時,往往需要為其設計和實作很多很小的類,也就是說,該子產品或子系統是由一組具有類似功能的類群組合而成。這樣一來,怎麼調用這些類就成了問題。Facade就是這樣一種模式,設計一個被稱為facade的類,該類提供一個簡單的調用接口:

- 隐藏具體的實作細節,簡化調用關系。

- 使得調用方的代碼更加簡潔明了。

- 通過facade,降低外部調用類與内部被調用類間的耦合程度。

- 可以為每個不同的任務需要,準備經過良好設計的簡易的API。

Facade模式可以用下面的類圖來表示:

Facade模式(外觀模式)

Facade

    為調用方定義簡單的調用接口。

Clients

    調用者。通過Facade接口調用提供某功能的内部類群。

Packages

    功能提供者。指提供功能的類群(子產品或子系統)。

Facade模式與Adapter模式的差別 Facade模式與Adapter模式存在着相當的相似之處:為即存的類提供界面統一的接口,以供外部類調用。

但Facade模式的目的是簡化調用關系;Adapter模式是為不同的子產品/子系統提供一個統一的接口(支援多态),旨在将一個或多個已經存在的不統一的接口轉化成為另一個統一的接口。

舉例說明:

1,Adapter模式:

有銀行A系統,銀行B系統,它們具有大緻一樣的功能,但它們的對外接口各不一樣。

如果需要在C系統中使用A系統或B系統,為了接口的一緻,我們需要在C系統中實作一個Adapter,通過這個Adapter提供的接口,我們就可以透明的調用銀行A系統的功能、或者銀行B系統的功能了;

2,Facade模式:

有銀行A系統,它具有非常複雜的功能,有融資,貸款,存款,取款,信用審查,擔保等等功能,

如果需要在C系統中,隻需用到A系統的一部分功能,比如融資,我們就可以為需要用到的融資功能封裝一個Facade,通過這個facade,我們不用管A系統的内部是怎麼實作融資業務的,也不用管信用審查是否通過,是否具有充分的擔保資源等等,大大簡化了用戶端的調用。

Facade模式的模型:

A系統有A1, A2, A3等類。用戶端需要調用A系統的的A1.doSomething1();A2.doSomething2();A3.doSomething3()來完成某功能。

Facade模式的實作模型就是:

A系統:

class A1 {

    public void doSomething1();

}

class A2 {

    public void doSomething2();

}

class A3 {

    public void doSomething3();

}

Facade:

public class Facade {

    public void doSomething() {

        A1 a1 = new A1();

        A1 a2 = new A2();

        A1 a3 = new A3();

        a1.doSomething1();

        a2.doSomething2();

        a3.doSomething3();

    }

}

Test:

public class Client {

    public static void main(String []args) {

        Facade facade = new Facade();

        facade.doSomething();

    }

}

繼續閱讀