<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的漫漫程序之旅

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

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

    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)夸張了(DrawerOneDrawerTwo):

    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)上所需的成本。



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

    評(píng)論

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

    Facade 原意是法語(yǔ)“正門”的意思,其實(shí)它的產(chǎn)生主要是讓client只能通過(guò)大門進(jìn)入,不然就無(wú)法存取內(nèi)部的類。所以它主要目的是封裝,里面所有的類的方法都應(yīng)該盡量是私有的,外部只能通過(guò)接口類進(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 | 木頭
    主站蜘蛛池模板: 在线免费观看一级片| 亚洲 欧洲 视频 伦小说| 国产美女a做受大片免费| 久久久久久AV无码免费网站下载| 亚洲国产欧美一区二区三区| 色婷婷亚洲十月十月色天| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲男人第一av网站| 亚洲国产成人五月综合网 | 亚洲人成电影院在线观看| 日韩亚洲人成在线综合日本| 成人午夜性A级毛片免费| 99久久免费精品视频| 日韩精品无码免费专区午夜不卡| 高潮毛片无遮挡高清免费| 亚洲日韩乱码中文字幕| 亚洲人成网网址在线看| 亚洲视频在线观看地址| 亚洲AV日韩AV永久无码久久| 久久久精品国产亚洲成人满18免费网站| 永久久久免费浮力影院| 成人免费视频试看120秒| 色播精品免费小视频| 亚洲成人免费在线| 99久热只有精品视频免费看| 中文字幕乱码一区二区免费| 波霸在线精品视频免费观看| 国产99精品一区二区三区免费| 亚洲AV成人一区二区三区观看| 亚洲七久久之综合七久久| 亚洲校园春色另类激情| 亚洲不卡中文字幕| 亚洲六月丁香婷婷综合| 亚洲av无码久久忘忧草| 中中文字幕亚洲无线码| 亚洲中文字幕乱码熟女在线| 亚洲欧美熟妇综合久久久久| 亚洲国产日韩a在线播放| 国产尤物在线视精品在亚洲| 免费国产va在线观看| h在线看免费视频网站男男|