為子系統(tǒng)中的一組接口提供一個統(tǒng)一的入口藤巢。外觀模式定義了一個高層接口炕横,這個接口使得這一子系統(tǒng)更加容易使用钧忽。
類型
結(jié)構(gòu)型
簡介
引入外觀模式之后胚泌,增加新的子系統(tǒng)或者移除子系統(tǒng)都非常方便省咨,客戶類無須進(jìn)行修改(或者極少的修改),只需要在外觀類中增加或移除對子系統(tǒng)的引用即可玷室。
外觀模式中所指的子系統(tǒng)是一個廣義的概念零蓉,它可以是一個類、一個功能模塊穷缤、系統(tǒng)的一個組成部分或者一個完整的系統(tǒng)敌蜂。子系統(tǒng)類通常是一些業(yè)務(wù)類,實(shí)現(xiàn)了一些具體的津肛、獨(dú)立的業(yè)務(wù)功能章喉。
參與者
- Facade(外觀角色):在客戶端可以調(diào)用它的方法,在外觀角色中可以知道相關(guān)的(一個或者多個)子系統(tǒng)的功能和責(zé)任身坐;在正常情況下秸脱,它將所有從客戶端發(fā)來的請求委派到相應(yīng)的子系統(tǒng)去,傳遞給相應(yīng)的子系統(tǒng)對象處理部蛇。
- SubSystem(子系統(tǒng)角色):在軟件系統(tǒng)中可以有一個或者多個子系統(tǒng)角色摊唇,每一個子系統(tǒng)可以不是一個單獨(dú)的類,而是一個類的集合涯鲁,它實(shí)現(xiàn)子系統(tǒng)的功能巷查;每一個子系統(tǒng)都可以被客戶端直接調(diào)用,或者被外觀角色調(diào)用抹腿,它處理由外觀類傳過來的請求岛请;子系統(tǒng)并不知道外觀的存在,對于子系統(tǒng)而言警绩,外觀角色僅僅是另外一個客戶端而已崇败。
用法
舉例
在幾乎所有的軟件中都能夠找到外觀模式的應(yīng)用,如絕大多數(shù)B/S系統(tǒng)都有一個首頁或者導(dǎo)航頁面房蝉,大部分C/S系統(tǒng)都提供了菜單或者工具欄僚匆,在這里,首頁和導(dǎo)航頁面就是B/S系統(tǒng)的外觀角色搭幻,而菜單和工具欄就是C/S系統(tǒng)的外觀角色,通過它們用戶可以快速訪問子系統(tǒng)逞盆,降低了系統(tǒng)的復(fù)雜程度檀蹋。所有涉及到與多個業(yè)務(wù)對象交互的場景都可以考慮使用外觀模式進(jìn)行重構(gòu)。
適用場景
- 當(dāng)要為訪問一系列復(fù)雜的子系統(tǒng)提供一個簡單入口時可以使用外觀模式。
- 客戶端程序與多個子系統(tǒng)之間存在很大的依賴性俯逾。引入外觀類可以將子系統(tǒng)與客戶端解耦贸桶,從而提高子系統(tǒng)的獨(dú)立性和可移植性。
- 在層次化結(jié)構(gòu)中桌肴,可以使用外觀模式定義系統(tǒng)中每一層的入口皇筛,層與層之間不直接產(chǎn)生聯(lián)系,而通過外觀類建立聯(lián)系坠七,降低層之間的耦合度水醋。
總結(jié)
外觀模式是一種使用頻率非常高的設(shè)計(jì)模式,它通過引入一個外觀角色來簡化客戶端與子系統(tǒng)之間的交互彪置,為復(fù)雜的子系統(tǒng)調(diào)用提供一個統(tǒng)一的入口拄踪,使子系統(tǒng)與客戶端的耦合度降低,且客戶端調(diào)用非常方便拳魁。外觀模式并不給系統(tǒng)增加任何新功能惶桐,它僅僅是簡化調(diào)用接口。
優(yōu)點(diǎn)
- 它對客戶端屏蔽了子系統(tǒng)組件潘懊,減少了客戶端所需處理的對象數(shù)目姚糊,并使得子系統(tǒng)使用起來更加容易。通過引入外觀模式授舟,客戶端代碼將變得很簡單叛拷,與之關(guān)聯(lián)的對象也很少。
- 它實(shí)現(xiàn)了子系統(tǒng)與客戶端之間的松耦合關(guān)系岂却,這使得子系統(tǒng)的變化不會影響到調(diào)用它的客戶端忿薇,只需要調(diào)整外觀類即可。
- 一個子系統(tǒng)的修改對其他子系統(tǒng)沒有任何影響躏哩,而且子系統(tǒng)內(nèi)部變化也不會影響到外觀對象署浩。
缺點(diǎn)
- 不能很好地限制客戶端直接使用子系統(tǒng)類,如果對客戶端訪問子系統(tǒng)類做太多的限制則減少了可變性和靈活 性扫尺。
- 如果設(shè)計(jì)不當(dāng)筋栋,增加新的子系統(tǒng)可能需要修改外觀類的源代碼,違背了開閉原則正驻。