我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          Java設(shè)計(jì)模式之Facade模式

          GOF《設(shè)計(jì)模式》一書對Facade模式是這樣描述的:

                 為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一接口。Facade模式定義了一個(gè)更高層的接口,使子系統(tǒng)更加容易使用。

                 大致意思是說:使用一種比原有方式更簡單的辦法與系統(tǒng)交互。例如,我們把一個(gè)很文件的文件,放在了第二抽屜里,而第二個(gè)抽屜的鑰匙放在了第一個(gè)抽屜里,我們要想取出這個(gè)文件,第一步肯定要拿到第一個(gè)抽屜的鑰匙,然后打開它再拿出第二個(gè)抽屜的鑰匙,最后打開第二個(gè)抽屜取出文件。

                 我就上面說的那個(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();

              }

          }

          由于沒有使用Façade模式,可以看到要想得到這個(gè)文件要首先打開第一個(gè)抽屜,然后再打開第二個(gè)抽屜,在我們實(shí)際所開發(fā)的系統(tǒng)中,有時(shí)候客戶要實(shí)現(xiàn)某一操作,并不需要知道實(shí)現(xiàn)這一操作的詳細(xì)步驟,而是簡單地點(diǎn)擊某一個(gè)按鈕就可以得到自己想要的結(jié)果。下面對上面的代碼使用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è)重要文件

          正如上面所說,客戶端client,它并不需要關(guān)心子系統(tǒng),而是關(guān)心DrawerFacade所留下來的和外部交互的接口,而子系統(tǒng)在DrawerFacade的聚合。

          以上只是個(gè)人拙見,哪里有不正確的地方,希望大家多多批評指正。^_^

              Facade模式主要適用于以下幾種情況:

          1)    不需要使用一個(gè)復(fù)雜系統(tǒng)的所有功能,而且可以創(chuàng)建一個(gè)新的類,包含訪問系統(tǒng)的所有規(guī)則。如果只需要使用系統(tǒng)的部分功能,那么你為新類所創(chuàng)建的API將比原系統(tǒng)的API簡單的多。

          2)    希望封裝或者隱藏系統(tǒng)原系統(tǒng)。

          3)    希望使用原系統(tǒng)的功能,而且還希望增加一些新的功能。

          4)    編寫新類的成本小于所有人學(xué)會使用或者未來維護(hù)原系統(tǒng)上所需的成本。



          posted on 2008-05-26 11:01 々上善若水々 閱讀(8014) 評論(1)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

          評論

          # re: Java設(shè)計(jì)模式之Facade模式  回復(fù)  更多評論   

          Facade 原意是法語“正門”的意思,其實(shí)它的產(chǎn)生主要是讓client只能通過大門進(jìn)入,不然就無法存取內(nèi)部的類。所以它主要目的是封裝,里面所有的類的方法都應(yīng)該盡量是私有的,外部只能通過接口類進(jìn)行使用。

          有一篇文章講得比較好:

          http://www.javaworld.com.tw/roller/qing/entry/%E5%88%A9%E7%94%A8fa%C3%A7ade%E6%A8%A1%E5%BC%8F%E4%BE%86%E5%8A%83%E5%88%86%E5%87%BA%E5%AD%90%E7%B3%BB%E7%B5%B1

          2008-05-27 23:06 | 木頭
          主站蜘蛛池模板: 东乡族自治县| 鄂州市| 宁强县| 保定市| 彩票| 呼玛县| 探索| 延津县| 广汉市| 尉犁县| 霍林郭勒市| 修武县| 德庆县| 安龙县| 且末县| 隆昌县| 全南县| 闵行区| 搜索| 乐都县| 衡南县| 清流县| 锦州市| 深水埗区| 瑞丽市| 慈利县| 兰西县| 钦州市| 长春市| 饶平县| 天津市| 汤阴县| 澎湖县| 吉安县| 云龙县| 攀枝花市| 宁武县| 齐齐哈尔市| 梧州市| 柳州市| 桐梓县|