設(shè)計(jì)模式系列之「門面模式」

《三國(guó)演義》中有曰:劉備昧识、諸葛亮趁曹操赤壁之戰(zhàn)失利,大肆擴(kuò)充地盤盗扒,先后占領(lǐng)荊州大部地區(qū)滞诺,引起東吳孫權(quán)的警惕形导。為了限制劉備勢(shì)力的發(fā)展,魯肅奉命向劉備討還荊州习霹,但遭到拒絕朵耕。東吳大都督周瑜向?qū)O權(quán)獻(xiàn)計(jì):趁劉備的甘夫人病故,用孫權(quán)的妹妹孫仁為誘餌淋叶,將劉備“賺到南徐阎曹,妻子不能勾得,幽囚在獄中”煞檩。 但是处嫌,這個(gè)詭計(jì)被諸葛亮一眼識(shí)破。他將計(jì)就計(jì)斟湃,讓劉備“擇日便去就親”熏迹,并派趙云前去保護(hù),并給了趙云三個(gè)錦囊凝赛,教趙云“依次而行”注暗。結(jié)果,使東吳“賠了夫人又折兵”墓猎。此為諸葛亮的錦囊三妙計(jì)捆昏。

一、三妙計(jì)

妙計(jì)一:見(jiàn)喬國(guó)老毙沾,并把劉備娶親的事情搞得東吳人盡皆知骗卜。

妙計(jì)二:用謊言(曹操打荊州)騙泡在溫柔鄉(xiāng)里的劉備回去。

妙計(jì)三:讓孫夫人擺平東吳的追兵左胞,她是孫權(quán)妹妹寇仓,東吳將領(lǐng)懼她三分。

二烤宙、妙計(jì)的兩種實(shí)施方案

1.把三個(gè)錦囊直接交給劉備焚刺,讓劉備根據(jù)情況打開(kāi)錦囊。

2.把錦囊交給趙云门烂,趙云按照諸葛亮的囑咐乳愉,依次按照情況使用錦囊。

三屯远、劉備用妙計(jì)

①妙計(jì)的接口

public interface Strategy {
    //妙計(jì)內(nèi)容
    public void carryOut();
}

②妙計(jì)一

public class StrategyOne implements Strategy {

    @Override
    public void carryOut() {
        System.out.println("見(jiàn)喬國(guó)老蔓姚,并把劉備娶親的事情搞得東吳人盡皆知。");
    }
}

③妙計(jì)二

public class StrategyTwo implements Strategy {

    @Override
    public void carryOut() {
        System.out.println("用謊言(曹操打荊州)騙泡在溫柔鄉(xiāng)里的劉備回去慨丐。");
    }
}

④妙計(jì)三

public class StrategyThree implements Strategy {

    @Override
    public void carryOut() {
        System.out.println("讓孫夫人擺平東吳的追兵坡脐。");
    }
}

⑤劉備使用妙計(jì)

public class Client {
    public static void main(String[] args) {
        //劉備一行人到達(dá)南徐的時(shí)候,打開(kāi)第一個(gè)錦囊
        Strategy strategyOne=new StrategyOne();
        strategyOne.carryOut();
        //周瑜和孫權(quán)通過(guò)計(jì)謀使劉備沉迷在溫柔鄉(xiāng)無(wú)法自拔
        Strategy strategyTwo=new StrategyTwo();
        strategyTwo.carryOut();
        //周瑜看計(jì)謀不行房揭,出兵攔殺劉備
        Strategy strategyThree=new StrategyThree();
        strategyThree.carryOut();
    }
}

輸出的結(jié)果為:

//劉備一行人到達(dá)南徐的時(shí)候备闲,打開(kāi)第一個(gè)錦囊
見(jiàn)喬國(guó)老晌端,并把劉備娶親的事情搞得東吳人盡皆知。

//周瑜和孫權(quán)通過(guò)計(jì)謀使劉備沉迷在溫柔鄉(xiāng)無(wú)法自拔
用謊言(曹操打荊州)騙泡在溫柔鄉(xiāng)里的劉備回去恬砂。

//周瑜看計(jì)謀不行咧纠,出兵攔殺劉備
讓孫夫人擺平東吳的追兵。

忽略其他正常因素(諸葛亮不可能把錦囊交給劉備實(shí)施)泻骤,代碼角度分析這種方案帶來(lái)的問(wèn)題

  • 錦囊使用是有前提的漆羔,要根據(jù)每個(gè)階段來(lái)使用對(duì)應(yīng)的錦囊,在編寫代碼中要清楚它們的順序狱掂,一旦出錯(cuò)就會(huì)造成劉備死翹翹演痒。這在面向?qū)ο蟮木幊讨惺菢O度地不適合,它根本就沒(méi)有完成一個(gè)類所具有的單一職責(zé)趋惨。

  • 外界訪問(wèn)直接深入到子系統(tǒng)內(nèi)部鸟顺,相互之間是一種強(qiáng)耦合關(guān)系,這樣的強(qiáng)依賴是系統(tǒng)設(shè)計(jì)所不能接受的器虾。

  • 子系統(tǒng)的內(nèi)部方法直接暴露給外部調(diào)用讯嫂,安全性低。

  • 當(dāng)錦囊數(shù)越來(lái)越多的時(shí)候曾撤,那么Client就需要調(diào)用更多錦囊類來(lái)實(shí)現(xiàn)端姚,這就會(huì)增加Client的實(shí)現(xiàn)難度晕粪,維護(hù)更加困難挤悉。

四、趙云協(xié)助用妙計(jì)(門面模式)

諸葛亮能夠想到應(yīng)對(duì)之策巫湘,當(dāng)然也會(huì)考慮到讓誰(shuí)和如何實(shí)施這三個(gè)錦囊才能夠讓劉備順利化險(xiǎn)為夷装悲。綜合上面劉備親自實(shí)施錦囊妙計(jì)帶來(lái)的問(wèn)題,安排趙云保管錦囊并在適當(dāng)?shù)臅r(shí)機(jī)協(xié)助實(shí)施才是上上之策尚氛。

1.UML實(shí)現(xiàn)

增加了一個(gè)ZhaoYunFacadee類诀诊,負(fù)責(zé)對(duì)錦囊實(shí)施過(guò)程進(jìn)行封裝,然后高層模塊只要和它有交互就成阅嘶。

2.增加的代碼模塊

①趙云充當(dāng)門面

public class ZhaoYunFacade {
    //妙計(jì)一
    private Strategy strategyOne=new StrategyOne();
    //妙計(jì)二
    private Strategy strategyTwo=new StrategyTwo();
    //妙計(jì)三
    private Strategy strategyThree=new StrategyThree();

    //三妙計(jì)統(tǒng)一讓趙云協(xié)助實(shí)施
    public void carryOut(){
        //劉備一行人到達(dá)南徐的時(shí)候属瓣,打開(kāi)第一個(gè)錦囊
        strategyOne.carryOut();
        //周瑜和孫權(quán)通過(guò)計(jì)謀使劉備沉迷在溫柔鄉(xiāng)無(wú)法自拔
        strategyTwo.carryOut();
        //周瑜看計(jì)謀不行,出兵攔殺劉備
        strategyThree.carryOut();
    }
}

劉備在遇到困難的時(shí)候讯柔,只要讓趙云根據(jù)諸葛亮的錦囊進(jìn)行處理抡蛙,這多簡(jiǎn)單,Client減少了很多工作魂迄。

②Client

public class Client {
    public static void main(String[] args) {
        //劉備遇到困難粗截,只要通過(guò)趙云按照錦囊實(shí)施,就可化險(xiǎn)為夷
        ZhaoYunFacade zhaoYunFacade=new ZhaoYunFacade();
    zhaoYunFacade.carryOut();;
    }   
}

輸出的結(jié)果為:

//劉備一行人到達(dá)南徐的時(shí)候捣炬,打開(kāi)第一個(gè)錦囊
見(jiàn)喬國(guó)老熊昌,并把劉備娶親的事情搞得東吳人盡皆知绽榛。

//周瑜和孫權(quán)通過(guò)計(jì)謀使劉備沉迷在溫柔鄉(xiāng)無(wú)法自拔
用謊言(曹操打荊州)騙泡在溫柔鄉(xiāng)里的劉備回去。

//周瑜看計(jì)謀不行婿屹,出兵攔殺劉備
讓孫夫人擺平東吳的追兵灭美。

運(yùn)行結(jié)果是相同的。場(chǎng)景類簡(jiǎn)化了很多选泻,只要與ZhaoYunFacade交互就成了冲粤,其他的什么都不用管,什么時(shí)候使用錦囊页眯、怎么用都不用管梯捕,只要調(diào)用ZhaoYunFacade提供的方法,就可以得到想要的妙計(jì)窝撵,這種方式不僅簡(jiǎn)單傀顾,而且擴(kuò)展性還非常好,同時(shí)不改變子系統(tǒng)對(duì)外暴露的接口碌奉、方法短曾,只改變內(nèi)部的處理邏輯,其他兄弟模塊的調(diào)用產(chǎn)生了不同的結(jié)果赐劣。

3.兩種方案的程序結(jié)構(gòu)圖

  • 沒(méi)有采用門面模式
  • 采用門面模式

總的來(lái)說(shuō)嫉拐,門面對(duì)象是外界訪問(wèn)子系統(tǒng)內(nèi)部的唯一通道,不管子系統(tǒng)內(nèi)部是多么雜亂無(wú)章魁兼。

五婉徘、門面模式的介紹

1.門面模式的定義

門面模式(Facade Pattern)也叫做外觀模式。要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信必須通過(guò)一個(gè)統(tǒng)一的對(duì)象進(jìn)行咐汞。門面模式提供一個(gè)高層次的接口盖呼,使得子系統(tǒng)更易于使用。

2.中介模式的角色介紹

  • Facade門面角色
    客戶端可以調(diào)用這個(gè)角色的方法化撕。此角色知曉子系統(tǒng)的所有功能和責(zé)任几晤。一般情況下,本角色會(huì)將所有從客戶端發(fā)來(lái)的請(qǐng)求委派到相應(yīng)的子系統(tǒng)去植阴,也就說(shuō)該角色沒(méi)有實(shí)際的業(yè)務(wù)邏輯蟹瘾,只是一個(gè)委托類。

  • subsystem子系統(tǒng)角色
    可以同時(shí)有一個(gè)或者多個(gè)子系統(tǒng)掠手。每一個(gè)子系統(tǒng)都不是一個(gè)單獨(dú)的類憾朴,而是一個(gè)類的集合。子系統(tǒng)并不知道門面的存在惨撇。對(duì)于子系統(tǒng)而言伊脓,門面僅僅是另外一個(gè)客戶端而已。

3.門面模式的使用場(chǎng)景

  • 為一個(gè)復(fù)雜的模塊或子系統(tǒng)提供一個(gè)供外界訪問(wèn)的接口。

  • 為降低個(gè)人代碼質(zhì)量對(duì)整體項(xiàng)目的影響風(fēng)險(xiǎn)报腔,只能在指定的子系統(tǒng)中開(kāi)發(fā)株搔,然后再提供門面接口進(jìn)行訪問(wèn)操作。

  • 子系統(tǒng)相對(duì)獨(dú)立——外界對(duì)子系統(tǒng)的訪問(wèn)只要黑箱操作即可纯蛾。

六纤房、門面模式優(yōu)缺點(diǎn)

1.優(yōu)點(diǎn)

減少系統(tǒng)的相互依賴。上面也提到不使用門面模式翻诉,外界訪問(wèn)直接深入到子系統(tǒng)內(nèi)部炮姨,相互之間是一種強(qiáng)耦合關(guān)系這樣的強(qiáng)依賴是系統(tǒng)設(shè)計(jì)所不能接受的,門面模式的出現(xiàn)就很好地解決了該問(wèn)題碰煌,所有的依賴都是對(duì)門面對(duì)象的依賴舒岸,與子系統(tǒng)無(wú)關(guān)。

提高了靈活性芦圾。依賴減少了蛾派,靈活性自然提高了。不管子系統(tǒng)內(nèi)部如何變化个少,只要不影響到門面對(duì)象洪乍,就沒(méi)有什么問(wèn)題了。

提高安全性夜焦。訪問(wèn)子系統(tǒng)的哪些業(yè)務(wù)就開(kāi)通哪些邏輯壳澳,不需要把子系統(tǒng)的內(nèi)部方法直接暴露給外部調(diào)用。

2.缺點(diǎn)

門面模式最大的缺點(diǎn)就是不符合開(kāi)閉原則茫经,對(duì)修改關(guān)閉巷波,對(duì)擴(kuò)展開(kāi)放。系統(tǒng)投產(chǎn)后發(fā)現(xiàn)問(wèn)題唯一能做的一件事就是修改門面角色的代碼科平,這個(gè)風(fēng)險(xiǎn)相當(dāng)大褥紫。

七姜性、簡(jiǎn)單對(duì)比門面模式和中介模式的區(qū)別

1.從定義上瞪慧,門面模式為復(fù)雜的子系統(tǒng)提供一個(gè)統(tǒng)一的訪問(wèn)界面,它定義的是一個(gè)高層接口部念,該接口使得子系統(tǒng)更加容易使用弃酌,避免外部模塊深入到子系統(tǒng)內(nèi)部而產(chǎn)生與子系統(tǒng)內(nèi)部細(xì)節(jié)耦合的問(wèn)題。中介者模式使用一個(gè)中介對(duì)象來(lái)封裝一系列同事對(duì)象的交互行為儡炼,它使各對(duì)象之間不再顯式地引用妓湘,從而使其耦合松散,建立一個(gè)可擴(kuò)展的應(yīng)用架構(gòu)乌询。

2.從功能上榜贴,門面模式只是增加了一個(gè)門面,它對(duì)子系統(tǒng)來(lái)說(shuō)沒(méi)有增加任何的功能妹田,子系統(tǒng)若脫離門面模式是完全可以獨(dú)立運(yùn)行的唬党。而中介者模式則增加了業(yè)務(wù)功能鹃共,它把各個(gè)同事類中的原有耦合關(guān)系移植到了中介者,同事類不可能脫離中介者而獨(dú)立存在驶拱。

3.從關(guān)系上霜浴,對(duì)門面模式來(lái)說(shuō),子系統(tǒng)不知道有門面存在蓝纲,而對(duì)中介者來(lái)說(shuō)阴孟,每個(gè)同事類都知道中介者存在,因?yàn)橐揽恐薪檎哒{(diào)和同事之間的關(guān)系税迷,它們對(duì)中介者非常了解永丝。

4.從封裝程度上,門面模式是一種簡(jiǎn)單的封裝箭养,所有的請(qǐng)求處理都委托給子系統(tǒng)完成类溢,而中介者模式則需要有一個(gè)中心,由中心協(xié)調(diào)同事類完成露懒,并且中心本身也完成部分業(yè)務(wù)闯冷,它屬于更進(jìn)一步的業(yè)務(wù)功能封裝。

八懈词、總結(jié)

門面模式是一個(gè)很好的封裝方法蛇耀,一個(gè)子系統(tǒng)比較復(fù)雜時(shí),比如算法或者業(yè)務(wù)比較復(fù)雜坎弯,就可以封裝出一個(gè)或多個(gè)門面出來(lái)纺涤,項(xiàng)目的結(jié)構(gòu)簡(jiǎn)單,而且擴(kuò)展性非常好抠忘。還有撩炊,對(duì)于一個(gè)較大項(xiàng)目,為了避免人員帶來(lái)的風(fēng)險(xiǎn)崎脉,也可以使用門面模式拧咳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市囚灼,隨后出現(xiàn)的幾起案子骆膝,更是在濱河造成了極大的恐慌,老刑警劉巖灶体,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阅签,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蝎抽,警方通過(guò)查閱死者的電腦和手機(jī)政钟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人养交,你說(shuō)我怎么就攤上這事衷戈。” “怎么了层坠?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵殖妇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我破花,道長(zhǎng)谦趣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任座每,我火速辦了婚禮前鹅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘峭梳。我一直安慰自己舰绘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布葱椭。 她就那樣靜靜地躺著捂寿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孵运。 梳的紋絲不亂的頭發(fā)上秦陋,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音治笨,去河邊找鬼驳概。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旷赖,可吹牛的內(nèi)容都是我干的顺又。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼等孵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稚照!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起流济,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锐锣,失蹤者是張志新(化名)和其女友劉穎腌闯,沒(méi)想到半個(gè)月后绳瘟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姿骏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年糖声,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蘸泻,死狀恐怖琉苇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悦施,我是刑警寧澤并扇,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抡诞,受9級(jí)特大地震影響穷蛹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昼汗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一肴熏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顷窒,春花似錦蛙吏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谓着,卻和暖如春馁龟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漆魔。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工坷檩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人改抡。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓矢炼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阿纤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子句灌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 第一回 宴桃園豪杰三結(jié)義 斬黃巾英雄首立功 漢末十常侍為奸,朝政日非,人心思亂. 張角兄弟起事.百姓擁護(hù),官軍望風(fēng)...
    JACKNPC閱讀 37,840評(píng)論 2 12
  • 首先聲明:我真的不是一個(gè)標(biāo)題黨。這個(gè)標(biāo)題和今天要講的常勝將軍趙云趙子龍絕對(duì)是有關(guān)的欠拾,且聽(tīng)我慢慢八卦胰锌。。藐窄。资昧。。...
    天外非仙閱讀 1,973評(píng)論 5 12
  • 設(shè)計(jì)模式匯總 一荆忍、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用格带、多...
    MinoyJet閱讀 3,948評(píng)論 1 15
  • 文/十月云 (一) 2004年春叽唱,一天早上剛上班屈呕,S醫(yī)院導(dǎo)診護(hù)士在大廳看到一對(duì)年輕夫婦帶著一個(gè)4、5歲大的男孩棺亭,正...
    十月云閱讀 1,518評(píng)論 12 48
  • 《成長(zhǎng)心連心》引用體驗(yàn)式學(xué)習(xí)方法使學(xué)生虎眨、家長(zhǎng)、老師體驗(yàn)到全面的教育發(fā)展镶摘,不單能夠激發(fā)學(xué)生的內(nèi)在潛力专甩,同時(shí)亦可創(chuàng)...
    潘饒平閱讀 180評(píng)論 0 0