facade 門面(外觀)模式

場(chǎng)景分析
  • 介紹一種場(chǎng)景宇挫,紅燒魚(yú)
  • 假定紅燒魚(yú)包括:腌魚(yú)苛吱,放入姜蒜、辣椒器瘪,煎魚(yú)四個(gè)步驟翠储,對(duì)應(yīng)的類實(shí)體包括Fish, Ginger, Pepper, client 執(zhí)行制作紅燒魚(yú)的動(dòng)作時(shí),可以單獨(dú)一個(gè)一個(gè)調(diào)用橡疼,但如果包括十幾個(gè)步驟時(shí)援所,直接讓Client接觸十幾個(gè)類是比較粗暴的,可以在 Client 和 功能實(shí)體類之間欣除,添加一層封裝類-Facade住拭,facade 將以功能單位進(jìn)行封裝劃分,定義出包含若干環(huán)節(jié)的接口,如將紅燒魚(yú)的所有環(huán)節(jié)封裝到fryFish 接口中
  • 病人看病的案例滔岳,Client 即病人杠娱,需要與 掛號(hào)、門診谱煤、取藥摊求、化驗(yàn)等直接打交道,亂刘离、復(fù)雜室叉,若出現(xiàn)一個(gè) 接待人員 facade 代替病人與各個(gè)系統(tǒng)打交道,則會(huì)減輕Client的復(fù)雜性
  • java的三層開(kāi)發(fā)模式
角色定義
  • 門面角色
    • 客戶端直接調(diào)用這個(gè)門面的方法硫惕,門面方法知曉子系統(tǒng)的功能和責(zé)任茧痕,且會(huì)將Client的請(qǐng)求委派到相應(yīng)子系統(tǒng)中
  • 子系統(tǒng)角色
    • 可以同時(shí)有一個(gè)或多個(gè)子系統(tǒng),每個(gè)子系統(tǒng)都可以直接被Client 調(diào)用恼除,也可被門面調(diào)用
    • 對(duì)于子系統(tǒng)而言踪旷,它并不知曉門面的存在,門面于它來(lái)講豁辉,只是另一個(gè)Client而已
代碼展示
  • Fish
public class Fish {

    //把魚(yú)腌一下
    public void pickleFish() {
        System.out.println("腌魚(yú)");
    }

    //煎魚(yú)
    public void fryFish() {
        System.out.println("煎魚(yú)");
    }
}
  • Ginger
/**
 * 姜
 */
public class Ginger {

    //放入姜片
    public void fryGinger(){
        System.out.println("熱油放入姜片");
    }
}

  • pepper
/**
 * 辣椒
 */
public class Pepper {
    //放入辣椒
    public void fryPepper() {
        System.out.println("炒辣椒");
    }
}
  • 定義 facade
/**
 * 定義紅燒魚(yú)的facade
 */
public class FishFacade {

    //把材料準(zhǔn)備好:魚(yú)埃脏,辣椒,姜片
    private Fish fish;
    private Ginger ginger;
    private Pepper pepper;

    //準(zhǔn)備材料
    public FishFacade() {
        //定義材料
        fish = new Fish();
        ginger = new Ginger();
        pepper = new Pepper();
    }

    //紅燒魚(yú)有若干步驟的秋忙,這里將所有分散步驟統(tǒng)一
    //該方法即所謂的 facade,以煎魚(yú)為整體功能模塊构舟,封裝了很多繁雜的環(huán)節(jié)灰追,避免Client 直接各自調(diào)用
    //這里我們只是定義菜料,有可能中間還要讓老婆幫忙系下圍裙狗超,或者讓兒子買包鹽去呢
    //總之是很多繁雜的邏輯
    public void fryFish() {
        //先把魚(yú)腌一下
        fish.pickleFish();
        //放入辣椒
        pepper.fryPepper();
        //放入姜片
        ginger.fryGinger();
        //煎魚(yú)
        fish.fryFish();
    }

}
  • 定義 Demo
public class FacadeDemo {

    public static void main(String[] args) {
        
        FishFacade fishFacade = new FishFacade();
        
        //調(diào)用 facade
        fishFacade.fryFish();
        
        //如果不使用 facade 則 單步執(zhí)行
        //腌魚(yú)
        //fish.pickleFish();
        
        //油放姜片
        //ginger.fryGinger();
        
        //油放辣椒
        //pepper.fryPepper();
        
        //煎魚(yú)
        //fish.fryFish();
    }

}
優(yōu)缺點(diǎn)
  • 優(yōu)點(diǎn)
    • 對(duì) Client 屏蔽了子系統(tǒng)的復(fù)雜性弹澎,降低了Client 與 子系統(tǒng)的直接交互
    • 實(shí)現(xiàn)子系統(tǒng)與 Client 的松耦合,使得子系統(tǒng)的變化不會(huì)影響到Client努咐,只需更改 facade 類即可
    • 降低了大型軟件系統(tǒng)的編譯依賴性苦蒿,簡(jiǎn)化了系統(tǒng)在不同平臺(tái)之間的移植過(guò)程 ?渗稍?佩迟?
    • 只是提供了一個(gè)訪問(wèn)子系統(tǒng)的統(tǒng)一入口并不影響用戶直接使用子系統(tǒng)
  • 缺點(diǎn)
    • 不能很好的限制Client對(duì)子系統(tǒng)的使用(Client可以直接調(diào)用子系統(tǒng))
    • 不引入抽象外觀類的情況下竿屹,增加新的子系統(tǒng)可能需要修改外觀類客戶端代碼报强,違背開(kāi)閉原則
其他注意點(diǎn)
  • 一個(gè)系統(tǒng)可以有多個(gè)外觀類
    • 通常只需要一個(gè)外觀類,且此外觀類只有一個(gè)實(shí)例拱燃,即單例類秉溉,可以節(jié)省資源
    • 系統(tǒng)可以設(shè)計(jì)多個(gè)外觀類,每個(gè)外觀類都負(fù)責(zé)和一些特定的子系統(tǒng)交互,向用戶提供相應(yīng)的業(yè)務(wù)功能
  • 不要試圖通過(guò)外觀類為子系統(tǒng)增加新的行為
    • 不要通過(guò)繼承一個(gè)外觀類在子系統(tǒng)中加入新行為召嘶,外觀的用意是為子系統(tǒng)提供一個(gè)集中化和簡(jiǎn)化的溝通渠道父晶,而非向子系統(tǒng)加入新行為,新行為的增加應(yīng)該通過(guò)修改原有子系統(tǒng)或增加新的子系統(tǒng)實(shí)現(xiàn)
  • 外觀模式與迪米特法則
    • 外觀類充當(dāng)了 Client 和 子系統(tǒng)之間的第三者弄跌,降低了Client 和 子系統(tǒng)的耦合
  • 抽象外觀類的引入
    • 外觀類缺點(diǎn)違背了開(kāi)閉原則甲喝,當(dāng)增加新的系統(tǒng)或者移出子系統(tǒng)時(shí)需要修改外觀類,可以通過(guò)引入抽象外觀類解決一定的問(wèn)題碟绑,對(duì)于新的業(yè)務(wù)需求俺猿,不修改原有外觀類,而對(duì)應(yīng)增加一個(gè)新的具體外觀類格仲,由新的具體外觀類關(guān)聯(lián)新的子系統(tǒng)對(duì)象

參考:http://blog.csdn.net/xingjiarong/article/details/50066133

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末押袍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凯肋,更是在濱河造成了極大的恐慌谊惭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侮东,死亡現(xiàn)場(chǎng)離奇詭異圈盔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)悄雅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門驱敲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宽闲,你說(shuō)我怎么就攤上這事众眨。” “怎么了容诬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵娩梨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我览徒,道長(zhǎng)狈定,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任习蓬,我火速辦了婚禮纽什,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躲叼。我一直安慰自己稿湿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布押赊。 她就那樣靜靜地躺著饺藤,像睡著了一般包斑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涕俗,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天罗丰,我揣著相機(jī)與錄音,去河邊找鬼再姑。 笑死萌抵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的元镀。 我是一名探鬼主播绍填,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栖疑!你這毒婦竟也來(lái)了讨永?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤遇革,失蹤者是張志新(化名)和其女友劉穎卿闹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體萝快,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锻霎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揪漩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旋恼。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奄容,靈堂內(nèi)的尸體忽然破棺而出蚌铜,到底是詐尸還是另有隱情,我是刑警寧澤嫩海,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站囚痴,受9級(jí)特大地震影響叁怪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜深滚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一奕谭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痴荐,春花似錦血柳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春根吁,著一層夾襖步出監(jiān)牢的瞬間员淫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工击敌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留介返,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓沃斤,卻偏偏與公主長(zhǎng)得像圣蝎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衡瓶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 生活中的示例## 外觀模式在現(xiàn)實(shí)生活中的示例很多徘公,比如:組裝電腦,通常會(huì)有兩種方案鞍陨。 一個(gè)...
    七寸知架構(gòu)閱讀 6,251評(píng)論 7 57
  • 定義 門面模式是對(duì)象的結(jié)構(gòu)模式步淹,外部與一個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的門面對(duì)象進(jìn)行。門面模式提供一個(gè)高層次的接口...
    步積閱讀 2,224評(píng)論 0 3
  • 文摘一:有些地方外觀模式也被叫做門面模式诚撵,英文即Facade Pattern缭裆,提前說(shuō)明一下。 試想這種情況寿烟,用戶添...
    _淺墨_閱讀 484評(píng)論 0 1
  • 本篇文章介紹一種設(shè)計(jì)模式——外觀模式澈驼。本篇文章內(nèi)容參考《JAVA與模式》之門面模式,外觀模式筛武,深入淺出外觀模式(二...
    Ruheng閱讀 7,074評(píng)論 0 8
  • 每天的生活快樂(lè)而充實(shí)缝其,每次感覺(jué)上班時(shí)時(shí)間過(guò)得很快,轉(zhuǎn)眼間就到了下班時(shí)間徘六。每次傍晚騎車走在街上内边,感覺(jué)心情很愉悅。 六...
    Hifly816閱讀 128評(píng)論 0 0