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