設(shè)計模式08_外觀模式_Facade

一括改、模式定義

外觀模式(Facade Pattern):外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的外觀對象進行,為子系統(tǒng)中的一組接口提供一個一致的界面家坎,外觀模式定義了一個高層接口嘱能,這個接口使得這一子系統(tǒng)更加容易使用。外觀模式又稱為門面模式虱疏,它是一種對象結(jié)構(gòu)型模式惹骂。

二、模式結(jié)構(gòu)

外觀模式包含如下角色:
  1做瞪、Facade: 外觀角色
  2对粪、SubSystem:子系統(tǒng)角色

image.png

三、代碼分析

System

public class SystemA { 
    public void operationA(){ 
        System.out.println("operation a..."); 
    }
}
public class SystemB { 
    public void operationB() { 
        System.out.println("operation b..."); 
    }
}
public class SystemC { 
    public void operationC() { 
        System.out.println("operation c..."); 
    }
}

Facade

public class Facade { 
    public void wrapOperation() { 
        SystemA a = new SystemA(); 
        a.operationA(); 
        SystemB b = new SystemB(); 
        b.operationB(); 
        SystemC c = new SystemC(); 
        c.operationC(); 
    }
}

Client

public class Client { 
    public static void main(String[] args) { 
        Facade facade = new Facade(); 
        facade.wrapOperation(); 
    }
}

結(jié)果

operation a...
operation b...
operation c...

四装蓬、模式分析

根據(jù)“單一職責原則”著拭,在軟件中將一個系統(tǒng)劃分為若干個子系統(tǒng)有利于降低整個系統(tǒng)的復(fù)雜性,一個常見的設(shè)計目標是使子系統(tǒng)間的通信和相互依賴關(guān)系達到最小牍帚,而達到該目標的途徑之一就是引入一個外觀對象儡遮,它為子系統(tǒng)的訪問提供了一個簡單而單一的入口。
  外觀模式也是“迪米特法則”的體現(xiàn)履羞,通過引入一個新的外觀類可以降低原有系統(tǒng)的復(fù)雜度峦萎,同時降低客戶類與子系統(tǒng)類的耦合度。
  外觀模式要求一個子系統(tǒng)的外部與其內(nèi)部的通信通過一個統(tǒng)一的外觀對象進行忆首,外觀類將客戶端與子系統(tǒng)的內(nèi)部復(fù)雜性分隔開爱榔,使得客戶端只需要與外觀對象打交道,而不需要與子系統(tǒng)內(nèi)部的很多對象打交道糙及。
  外觀模式的目的在于降低系統(tǒng)的復(fù)雜程度详幽。
  外觀模式從很大程度上提高了客戶端使用的便捷性,使得客戶端無須關(guān)心子系統(tǒng)的工作細節(jié),通過外觀角色即可調(diào)用相關(guān)功能唇聘。

五版姑、優(yōu)點

外觀模式的優(yōu)點
  對客戶屏蔽子系統(tǒng)組件,減少了客戶處理的對象數(shù)目并使得子系統(tǒng)使用起來更加容易迟郎。通過引入外觀模式剥险,客戶代碼將變得很簡單,與之關(guān)聯(lián)的對象也很少宪肖。實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系表制,這使得子系統(tǒng)的組件變化不會影響到調(diào)用它的客戶類,只需要調(diào)整外觀類即可控乾。
  降低了大型軟件系統(tǒng)中的編譯依賴性么介,并簡化了系統(tǒng)在不同平臺之間的移植過程,因為編譯一個子系統(tǒng)一般不需要編譯所有其他的子系統(tǒng)蜕衡。一個子系統(tǒng)的修改對其他子系統(tǒng)沒有任何影響壤短,而且子系統(tǒng)內(nèi)部變化也不會影響到外觀對象。
  只是提供了一個訪問子系統(tǒng)的統(tǒng)一入口慨仿,并不影響用戶直接使用子系統(tǒng)類久脯。

六、缺點

外觀模式的缺點
  不能很好地限制客戶使用子系統(tǒng)類镶骗,如果對客戶訪問子系統(tǒng)類做太多的限制則減少了可變性和靈活性桶现。
  在不引入抽象外觀類的情況下,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼鼎姊,違背了“開閉原則”。

七相赁、適用環(huán)境

在以下情況下可以使用外觀模式:
  當要為一個復(fù)雜子系統(tǒng)提供一個簡單接口時可以使用外觀模式相寇。該接口可以滿足大多數(shù)用戶的需求,而且用戶也可以越過外觀類直接訪問子系統(tǒng)钮科。
  客戶程序與多個子系統(tǒng)之間存在很大的依賴性唤衫。引入外觀類將子系統(tǒng)與客戶以及其他子系統(tǒng)解耦,可以提高子系統(tǒng)的獨立性和可移植性绵脯。
  在層次化結(jié)構(gòu)中佳励,可以使用外觀模式定義系統(tǒng)中每一層的入口,層與層之間不直接產(chǎn)生聯(lián)系蛆挫,而通過外觀類建立聯(lián)系赃承,降低層之間的耦合度。

八悴侵、模式擴展

一個系統(tǒng)有多個外觀類
  在外觀模式中瞧剖,通常只需要一個外觀類,并且此外觀類只有一個實例,換言之它是一個單例類抓于。在很多情況下為了節(jié)約系統(tǒng)資源做粤,一般將外觀類設(shè)計為單例類。當然這并不意味著在整個系統(tǒng)里只能有一個外觀類捉撮,在一個系統(tǒng)中可以設(shè)計多個外觀類怕品,每個外觀類都負責和一些特定的子系統(tǒng)交互,向用戶提供相應(yīng)的業(yè)務(wù)功能巾遭。
  不要試圖通過外觀類為子系統(tǒng)增加新行為
  不要通過繼承一個外觀類在子系統(tǒng)中加入新的行為堵泽,這種做法是錯誤的。外觀模式的用意是為子系統(tǒng)提供一個集中化和簡化的溝通渠道恢总,而不是向子系統(tǒng)加入新的行為迎罗,新的行為的增加應(yīng)該通過修改原有子系統(tǒng)類或增加新的子系統(tǒng)類來實現(xiàn),不能通過外觀類來實現(xiàn)片仿。
  外觀模式與迪米特法則
  外觀模式創(chuàng)造出一個外觀對象纹安,將客戶端所涉及的屬于一個子系統(tǒng)的協(xié)作伙伴的數(shù)量減到最少,使得客戶端與子系統(tǒng)內(nèi)部的對象的相互作用被外觀對象所取代砂豌。外觀類充當了客戶類與子系統(tǒng)類之間的“第三者”厢岂,降低了客戶類與子系統(tǒng)類之間的耦合度,外觀模式就是實現(xiàn)代碼重構(gòu)以便達到“迪米特法則”要求的一個強有力的武器阳距。
  抽象外觀類的引入
  外觀模式最大的缺點在于違背了“開閉原則”塔粒,當增加新的子系統(tǒng)或者移除子系統(tǒng)時需要修改外觀類,可以通過引入抽象外觀類在一定程度上解決該問題筐摘,客戶端針對抽象外觀類進行編程卒茬。對于新的業(yè)務(wù)需求,不修改原有外觀類咖熟,而對應(yīng)增加一個新的具體外觀類圃酵,由新的具體外觀類來關(guān)聯(lián)新的子系統(tǒng)對象,同時通過修改配置文件來達到不修改源代碼并更換外觀類的目的馍管。

九郭赐、總結(jié)

在外觀模式中,外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的外觀對象進行确沸,為子系統(tǒng)中的一組接口提供一個一致的界面捌锭,外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用罗捎。外觀模式又稱為門面模式观谦,它是一種對象結(jié)構(gòu)型模式。
  外觀模式包含兩個角色:外觀角色是在客戶端直接調(diào)用的角色宛逗,在外觀角色中可以知道相關(guān)的(一個或者多個)子系統(tǒng)的功能和責任坎匿,它將所有從客戶端發(fā)來的請求委派到相應(yīng)的子系統(tǒng)去,傳遞給相應(yīng)的子系統(tǒng)對象處理;在軟件系統(tǒng)中可以同時有一個或者多個子系統(tǒng)角色替蔬,每一個子系統(tǒng)可以不是一個單獨的類告私,而是一個類的集合,它實現(xiàn)子系統(tǒng)的功能承桥。
  外觀模式要求一個子系統(tǒng)的外部與其內(nèi)部的通信通過一個統(tǒng)一的外觀對象進行驻粟,外觀類將客戶端與子系統(tǒng)的內(nèi)部復(fù)雜性分隔開,使得客戶端只需要與外觀對象打交道凶异,而不需要與子系統(tǒng)內(nèi)部的很多對象打交道蜀撑。
  外觀模式主要優(yōu)點在于對客戶屏蔽子系統(tǒng)組件,減少了客戶處理的對象數(shù)目并使得子系統(tǒng)使用起來更加容易剩彬,它實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系酷麦,并降低了大型軟件系統(tǒng)中的編譯依賴性,簡化了系統(tǒng)在不同平臺之間的移植過程喉恋;其缺點在于不能很好地限制客戶使用子系統(tǒng)類沃饶,而且在不引入抽象外觀類的情況下,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼轻黑,違背了“開閉原則”糊肤。
  外觀模式適用情況包括:要為一個復(fù)雜子系統(tǒng)提供一個簡單接口;客戶程序與多個子系統(tǒng)之間存在很大的依賴性氓鄙;在層次化結(jié)構(gòu)中馆揉,需要定義系統(tǒng)中每一層的入口,使得層與層之間不直接產(chǎn)生聯(lián)系抖拦。

作者:博麟K
鏈接:http://www.reibang.com/p/f28d71ee46e7
來源:簡書
簡書著作權(quán)歸作者所有升酣,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟋座,一起剝皮案震驚了整個濱河市拗踢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌向臀,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诸狭,死亡現(xiàn)場離奇詭異券膀,居然都是意外死亡,警方通過查閱死者的電腦和手機驯遇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門芹彬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叉庐,你說我怎么就攤上這事舒帮。” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵玩郊,是天一觀的道長肢执。 經(jīng)常有香客問我,道長译红,這世上最難降的妖魔是什么预茄? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮侦厚,結(jié)果婚禮上耻陕,老公的妹妹穿的比我還像新娘。我一直安慰自己刨沦,他們只是感情好诗宣,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著想诅,像睡著了一般召庞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侧蘸,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天裁眯,我揣著相機與錄音,去河邊找鬼讳癌。 笑死穿稳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晌坤。 我是一名探鬼主播逢艘,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骤菠!你這毒婦竟也來了它改?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤商乎,失蹤者是張志新(化名)和其女友劉穎央拖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹉戚,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡鲜戒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抹凳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遏餐。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赢底,靈堂內(nèi)的尸體忽然破棺而出失都,到底是詐尸還是另有隱情柏蘑,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布粹庞,位于F島的核電站咳焚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏信粮。R本人自食惡果不足惜黔攒,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望强缘。 院中可真熱鬧督惰,春花似錦、人聲如沸旅掂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽商虐。三九已至觉阅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秘车,已是汗流浹背典勇。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叮趴,地道東北人割笙。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像眯亦,于是被迫代替她去往敵國和親伤溉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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