設(shè)計(jì)模式-門面模式

一:門面模式的定義

外觀模式的目的不是給予子系統(tǒng)添加新的功能接口您朽,而是為了讓外部減少與子系統(tǒng)內(nèi)多個(gè)模塊的交互,松散耦合,從而讓外部能夠更簡(jiǎn)單地使用子系統(tǒng)。

外觀模式的本質(zhì)是:封裝交互粒没,簡(jiǎn)化調(diào)用。

外觀模式的一般描述是:外觀模式定義了一個(gè)高層的功能簇爆,為子系統(tǒng)中的多個(gè)模塊協(xié)同的完成某種功能需求提供簡(jiǎn)單的對(duì)外功能調(diào)用方式癞松,使得這一子系統(tǒng)更加容易被外部使用爽撒。


--->門面模式(Facade Pattern)也叫做外觀模式,是一種比較常用的封裝模式

--->要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信必須通過(guò)一個(gè)統(tǒng)一的對(duì)象進(jìn)行。門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用响蓉。

--->門面模式注重“統(tǒng)一的對(duì)象”,也就是提供一個(gè)訪問(wèn)子系統(tǒng)的接口,除了這個(gè)接口不允許有任何訪問(wèn)子系統(tǒng)的行為發(fā)生

--->這正是我們?cè)O(shè)計(jì)所需要的模式,不改變子系統(tǒng)對(duì)外暴露的接口硕勿、方法,只改變內(nèi)部的處理邏輯,其他兄弟模塊的調(diào)用產(chǎn)生了不同的結(jié)果,確實(shí)是一個(gè)非常棒的設(shè)計(jì)。這就是門面模式

二:門面模式的角色

● 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è)客戶端而已举畸。

三:門面模式應(yīng)用

門面模式有如下優(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ì)象,任你自由活動(dòng)抄沮。

● 提高安全性

想讓你訪問(wèn)子系統(tǒng)的哪些業(yè)務(wù)就開(kāi)通哪些邏輯,不在門面上開(kāi)通的方法,你休想訪問(wèn)到。

門面模式有如下缺點(diǎn)

門面模式最大的缺點(diǎn)就是不符合開(kāi)閉原則,對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放,看看我們那個(gè)門對(duì)象吧,它可是重中之重,一旦在系統(tǒng)投產(chǎn)后發(fā)現(xiàn)有一個(gè)小錯(cuò)誤,你怎么解決?完全遵從開(kāi)閉原則,根本沒(méi)辦法解決岖瑰。繼承?覆寫?都頂不上用,唯一能做的一件事就是修改門面角色的代碼,這個(gè)風(fēng)險(xiǎn)相當(dāng)大,這就需要大家在設(shè)計(jì)的時(shí)候慎之又慎,多思考幾遍才會(huì)有好收獲叛买。

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

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

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

比如利息的計(jì)算問(wèn)題,沒(méi)有深厚的業(yè)務(wù)知識(shí)和扎實(shí)的技術(shù)水平是不可能開(kāi)發(fā)出該子系統(tǒng)的,但是對(duì)于使用該系統(tǒng)的開(kāi)發(fā)人員來(lái)說(shuō),他需要做的就是輸入金額以及存期,其他的都不用關(guān)心,返回的結(jié)果就是利息,這時(shí)候,門面模式是非使用不可了。

預(yù)防低水平人員帶來(lái)的風(fēng)險(xiǎn)擴(kuò)散

比如一個(gè)低水平的技術(shù)人員參與項(xiàng)目開(kāi)發(fā),為降低個(gè)人代碼質(zhì)量對(duì)整體項(xiàng)目的影響風(fēng)險(xiǎn),一般的做法是“畫地為牢”,只能在指定的子系統(tǒng)中開(kāi)發(fā),然后再提供門面接口進(jìn)行訪問(wèn)操作蹋订。

四:門面模式的注意事項(xiàng)

---> 一個(gè)子系統(tǒng)可以有多個(gè)門面

● 門面已經(jīng)龐大到不能忍受的程度

比如一個(gè)純潔的門面對(duì)象已經(jīng)超過(guò)了200行的代碼,雖然都是非常簡(jiǎn)單的委托操作,也建議拆分成多個(gè)門面,否則會(huì)給以后的維護(hù)和擴(kuò)展帶來(lái)不必要的麻煩率挣。那怎么拆分呢?按照功能拆分是一個(gè)非常好的原則,比如一個(gè)數(shù)據(jù)庫(kù)操作的門面可以拆分為查詢門面、刪除門面露戒、更新門面等椒功。

子系統(tǒng)可以提供不同訪問(wèn)路徑

如果A角色,B角色外部系統(tǒng)訪問(wèn)門面C智什,A角色有權(quán)限訪問(wèn)門面C所有的方法动漾,但B角色只有訪問(wèn)門面C一部分方法。則需要新建立一個(gè)門面D供B角色使用荠锭,而D門面只是代理了門面A旱眯,A門面給D門面提供B角色的權(quán)限。

--->門面不參與子系統(tǒng)內(nèi)的業(yè)務(wù)邏輯

門面不參與子系統(tǒng)內(nèi)的業(yè)務(wù)邏輯 证九,如果門面內(nèi)依賴的角色有相互調(diào)用的關(guān)系删豺,則需要將項(xiàng)目調(diào)用的角色封裝成一個(gè)新的角色,聚合到門面中甫贯。

五:門面模式的實(shí)戰(zhàn)

門面模式是一個(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),也可以使用門面模式,技術(shù)水平比較差的成員,盡量安排獨(dú)立的模塊,然后把他寫的程序封裝到一個(gè)門面里

六:門面模式的案例

【1】寫信的業(yè)務(wù)類

package com.yeepay.sxf.template18;

/*** 寫信的業(yè)務(wù)類?隱藏在門面角色里邊,不需要暴露太多*/

public interface? ILetterProcess {//寫信的內(nèi)容

public void writeContext(String context);//寫信的地址

public void fillEnvelope(String address);//將信裝入信封

public void letterInotoEnvelope();//發(fā)送信件

public void sendLetter();}

【2】寫信的業(yè)務(wù)類的實(shí)現(xiàn)

public class LetterProcessImpl? implements ILetterProcess{

@Override

public void writeContext(String context) {System.out.println("LetterProcessImpl.writeContext()寫信的內(nèi)容:"+context);}

@Override

public void fillEnvelope(String address) {System.out.println("LetterProcessImpl.fillEnvelope()寫信的郵寄地址:"+address);}

@Override

public void letterInotoEnvelope() {System.out.println("LetterProcessImpl.letterInotoEnvelope()將信裝入信封");}

@Override

public void sendLetter() {System.out.println("LetterProcessImpl.sendLetter()郵寄信");}

}

【3】寫信的業(yè)務(wù)類的門面角色

package com.yeepay.sxf.template18;

/*** 寫信的門面角色?一個(gè)人想寫信叫搁,只需要給這個(gè)門面提供相應(yīng)的參數(shù)赔桌,后續(xù)事件不用關(guān)心供炎。*/

public class ModenPostOffce {

private ILetterProcess letterProcess;

public ModenPostOffce(ILetterProcess letterProcess){this.letterProcess=letterProcess;}

public void sendLetter(String context,String address){//寫信

letterProcess.writeContext(context);//寫地址

letterProcess.fillEnvelope(address);//裝信封

letterProcess.letterInotoEnvelope();//發(fā)送信件

letterProcess.sendLetter();}}

【4】客戶端測(cè)試

public class ClientTest {

public static void main(String[] args) {//寫信的業(yè)務(wù)類

ILetterProcess letterProcess=new LetterProcessImpl();//寫信業(yè)務(wù)類的門面類

ModenPostOffce modenPostOffce=new ModenPostOffce(letterProcess);//一個(gè)人員通過(guò)門面寫信

modenPostOffce.sendLetter("dddsdfdf", "cccccccccc");}}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疾党,隨后出現(xiàn)的幾起案子音诫,更是在濱河造成了極大的恐慌,老刑警劉巖雪位,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竭钝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雹洗,警方通過(guò)查閱死者的電腦和手機(jī)香罐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)时肿,“玉大人庇茫,你說(shuō)我怎么就攤上這事◇Τ桑” “怎么了旦签?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寸宏。 經(jīng)常有香客問(wèn)我宁炫,道長(zhǎng),這世上最難降的妖魔是什么氮凝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任羔巢,我火速辦了婚禮,結(jié)果婚禮上覆醇,老公的妹妹穿的比我還像新娘朵纷。我一直安慰自己,他們只是感情好永脓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布袍辞。 她就那樣靜靜地躺著,像睡著了一般常摧。 火紅的嫁衣襯著肌膚如雪搅吁。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天落午,我揣著相機(jī)與錄音谎懦,去河邊找鬼。 笑死溃斋,一個(gè)胖子當(dāng)著我的面吹牛界拦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梗劫,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼享甸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼截碴!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蛉威,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤日丹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蚯嫌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哲虾,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年择示,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了束凑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡对妄,死狀恐怖湘今,靈堂內(nèi)的尸體忽然破棺而出敢朱,到底是詐尸還是另有隱情剪菱,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布拴签,位于F島的核電站孝常,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蚓哩。R本人自食惡果不足惜构灸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岸梨。 院中可真熱鬧喜颁,春花似錦、人聲如沸曹阔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赃份。三九已至寂拆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抓韩,已是汗流浹背纠永。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谒拴,地道東北人尝江。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像英上,于是被迫代替她去往敵國(guó)和親炭序。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怠蹂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 定義 門面模式是對(duì)象的結(jié)構(gòu)模式,外部與一個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的門面對(duì)象進(jìn)行少态。門面模式提供一個(gè)高層次的接口...
    步積閱讀 2,209評(píng)論 0 3
  • //聯(lián)系人:石虎QQ:1224614774昵稱:嗡嘛呢叭咪哄 一城侧、概念 門面模式也稱為外觀模式。門面模式提供了一個(gè)...
    石虎132閱讀 507評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理彼妻,服務(wù)發(fā)現(xiàn)嫌佑,斷路器,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 藝術(shù)鑒賞閱讀 328評(píng)論 0 5
  • 已經(jīng)晚上九點(diǎn)半了侨歉,還有半小時(shí)晚晴的咖啡館就要關(guān)門了屋摇。晚晴還在吧臺(tái)忙碌,整理整理杯子幽邓,清洗機(jī)器炮温,當(dāng)然還要算一算今天的...
    離魂吟魄閱讀 412評(píng)論 16 8