門(mén)面模式(Facade)也稱為外觀模式,GOF 在《設(shè)計(jì)模式》一書(shū)中給出如下定義:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面, Facade 模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用.
門(mén)面(Facade)角色:客戶端可以調(diào)用這個(gè)角色的方法。此角色知曉相關(guān)的(一個(gè)或者多個(gè))子系統(tǒng)的功能和責(zé)任.在正常情況下,本角色會(huì)將所有從客戶端發(fā)來(lái)的請(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)用,或者被門(mén)面角色調(diào)用。子系統(tǒng)并不知道門(mén)面的存在,對(duì)于子系統(tǒng)而言,門(mén)面僅僅是另外一個(gè)客戶端而已.
測(cè)試代碼:
func work() {
let cook:Cook = Cook()
let service:Service = Service()
cook.cook()
service.server()
}
}
class Cook {
func cook() {
print("開(kāi)始做飯,炒菜")
}
}
class Service {
func server() {
print("提供飯菜給客人")
}
}
let facade:Facade = Facade()
facade.work()
優(yōu)點(diǎn):
對(duì)客戶屏蔽子系統(tǒng)組件,減少了客戶處理的對(duì)象數(shù)目并使得子系統(tǒng)使用起來(lái)更加容易。通過(guò)引入門(mén)面模式,客戶代碼將變得很簡(jiǎn)單,與之關(guān)聯(lián)的對(duì)象也很少。
實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,這使得子系統(tǒng)的組件變化不會(huì)影響到調(diào)用它的客戶類,只需要調(diào)整外觀類即可。
降低了大型軟件系統(tǒng)中的編譯依賴性,并簡(jiǎn)化了系統(tǒng)在不同平臺(tái)之間的移植過(guò)程,因?yàn)榫幾g一個(gè)子系統(tǒng)一般不需要編譯所有其他的子系統(tǒng)。一個(gè)子系統(tǒng)的修改對(duì)其他子系統(tǒng)沒(méi)有任何影響,而且子系統(tǒng)內(nèi)部變化也不會(huì)影響到外觀對(duì)象。
只是提供了一個(gè)訪問(wèn)子系統(tǒng)的統(tǒng)一入口,并不影響用戶直接使用子系統(tǒng)類。
缺點(diǎn):
不能很好地限制客戶使用子系統(tǒng)類,如果對(duì)客戶訪問(wèn)子系統(tǒng)類做太多的限制則減少了可變性和靈活性。
在不引入抽象外觀類的情況下,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了“開(kāi)閉原則”.
參考鏈接:
http://blog.csdn.net/xingjiarong/article/details/50066133