門面模式(Facade)也稱為外觀模式蛤虐,GOF 在《設(shè)計(jì)模式》一書中給出如下定義:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面旱眯, Facade 模式定義了一個(gè)高層接口于毙,這個(gè)接口使得這一子系統(tǒng)更加容易使用.
門面(Facade)角色:客戶端可以調(diào)用這個(gè)角色的方法连舍。此角色知曉相關(guān)的(一個(gè)或者多個(gè))子系統(tǒng)的功能和責(zé)任.在正常情況下艰垂,本角色會(huì)將所有從客戶端發(fā)來的請(qǐng)求委派到相應(yīng)的子系統(tǒng)去.
子系統(tǒng)(subsystem)角色:可以同時(shí)有一個(gè)或者多個(gè)子系統(tǒng)兜喻。每一個(gè)子系統(tǒng)都不是一個(gè)單獨(dú)的類梦染,而是一個(gè)類的集合。每一個(gè)子系統(tǒng)都可以被客戶端直接調(diào)用朴皆,或者被門面角色調(diào)用帕识。子系統(tǒng)并不知道門面的存在,對(duì)于子系統(tǒng)而言遂铡,門面僅僅是另外一個(gè)客戶端而已.
測試代碼:
func work() {
let cook:Cook = Cook()
let service:Service = Service()
cook.cook()
service.server()
}
}
class Cook {
func cook() {
print("開始做飯肮疗,炒菜")
}
}
class Service {
func server() {
print("提供飯菜給客人")
}
}
let facade:Facade = Facade()
facade.work()
優(yōu)點(diǎn):
對(duì)客戶屏蔽子系統(tǒng)組件,減少了客戶處理的對(duì)象數(shù)目并使得子系統(tǒng)使用起來更加容易扒接。通過引入門面模式伪货,客戶代碼將變得很簡單,與之關(guān)聯(lián)的對(duì)象也很少钾怔。
實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系碱呼,這使得子系統(tǒng)的組件變化不會(huì)影響到調(diào)用它的客戶類,只需要調(diào)整外觀類即可蒂教。
降低了大型軟件系統(tǒng)中的編譯依賴性巍举,并簡化了系統(tǒng)在不同平臺(tái)之間的移植過程,因?yàn)榫幾g一個(gè)子系統(tǒng)一般不需要編譯所有其他的子系統(tǒng)凝垛。一個(gè)子系統(tǒng)的修改對(duì)其他子系統(tǒng)沒有任何影響懊悯,而且子系統(tǒng)內(nèi)部變化也不會(huì)影響到外觀對(duì)象。
只是提供了一個(gè)訪問子系統(tǒng)的統(tǒng)一入口梦皮,并不影響用戶直接使用子系統(tǒng)類炭分。
缺點(diǎn):
不能很好地限制客戶使用子系統(tǒng)類,如果對(duì)客戶訪問子系統(tǒng)類做太多的限制則減少了可變性和靈活性剑肯。
在不引入抽象外觀類的情況下捧毛,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”.
參考鏈接:
http://blog.csdn.net/xingjiarong/article/details/50066133