GOF
《設計模式》一書對Facade
模式是這樣描述的:
為子系統中的一組接口提供一個統一接口。Facade模式定義了一個更高層的接口,使子系統更加容易使用。
大致意思是說:使用一種比原有方式更簡單的辦法與系統交互。例如,我們把一個很文件的文件,放在了第二抽屜里,而第二個抽屜的鑰匙放在了第一個抽屜里,我們要想取出這個文件,第一步肯定要拿到第一個抽屜的鑰匙,然后打開它再拿出第二個抽屜的鑰匙,最后打開第二個抽屜取出文件。
我就上面說的那個情形寫一下實現代碼,首先我們要實現二個子系統,呵呵,把抽屜比喻成系統,有點夸張了(DrawerOne、DrawerTwo):
class DrawerOne {
public void open(){
System.out.println("第一個抽屜被打開了");
getKey();
}
public void getKey(){
System.out.println("得到第二個抽屜的鑰匙");
}
}
class DrawerTwo{
public void open(){
System.out.println("第二個抽屜被打開了");
getFile();
}
public void getFile(){
System.out.println("得到這個重要文件");
}
}
public class Client{
public static void main(String []args){
DrawerOne darwerOne=new DrawerOne();
DrawerTwo darwerTwo=new DrawerTwo();
darwerOne.open();
darwerTwo.open();
}
}
由于沒有使用Façade模式,可以看到要想得到這個文件要首先打開第一個抽屜,然后再打開第二個抽屜,在我們實際所開發的系統中,有時候客戶要實現某一操作,并不需要知道實現這一操作的詳細步驟,而是簡單地點擊某一個按鈕就可以得到自己想要的結果。下面對上面的代碼使用Façade模式進行改進,建立一個FacadeDrawer類:
class DrawerFacade{
DrawerOne darwerOne=new DrawerOne();
DrawerTwo darwerTwo=new DrawerTwo();
public void open(){
darwerOne.open();
darwerTwo.open();
}
}
修改Client類:
public class DrawerClient{
public static void main(String []args){
DrawerFacade drawer=new DrawerFacade();
drawer.open();
}
}
輸出結果如下:
第一個抽屜被打開了
得到第二個抽屜的鑰匙
第二個抽屜被打開了
得到這個重要文件
正如上面所說,客戶端client,它并不需要關心子系統,而是關心DrawerFacade所留下來的和外部交互的接口,而子系統在DrawerFacade的聚合。
以上只是個人拙見,哪里有不正確的地方,希望大家多多批評指正。^_^
Facade模式主要適用于以下幾種情況:
1) 不需要使用一個復雜系統的所有功能,而且可以創建一個新的類,包含訪問系統的所有規則。如果只需要使用系統的部分功能,那么你為新類所創建的API將比原系統的API簡單的多。
2) 希望封裝或者隱藏系統原系統。
3) 希望使用原系統的功能,而且還希望增加一些新的功能。
4) 編寫新類的成本小于所有人學會使用或者未來維護原系統上所需的成本。