門(mén)面模式也叫作外觀模式嬉探,是一種比較常用的封裝模式,定義如下:
Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to user.
對(duì)子系統(tǒng)的一系列接口提供一個(gè)統(tǒng)一的接口,該接口就是門(mén)面枫疆。門(mén)面定義了一個(gè)一個(gè)更高層次的接口娇斑,對(duì)用戶(hù)來(lái)說(shuō)使用子系統(tǒng)的更加加單。
門(mén)面模式的通用類(lèi)圖如下:
類(lèi)圖很簡(jiǎn)單吗铐,但是代表的意義卻異常復(fù)雜东亦,Subsystem classes是子系統(tǒng)所有類(lèi)的統(tǒng)稱(chēng),可能代表一個(gè)類(lèi)唬渗,也可能代表十幾個(gè)類(lèi)典阵,甚至代表多個(gè)Substem。也就是所不管是一個(gè)子系統(tǒng)還是多個(gè)子系統(tǒng)镊逝,不管子系統(tǒng)內(nèi)部依賴(lài)多復(fù)雜壮啊,對(duì)外不的用戶(hù)來(lái)說(shuō),都不用關(guān)心撑蒜,并且都不可見(jiàn)歹啼,用戶(hù)只能訪問(wèn)facade,由facade來(lái)對(duì)內(nèi)部訪問(wèn)進(jìn)行訪問(wèn)座菠。但是需要注意的是:facade一定不能涉及業(yè)務(wù)邏輯狸眼。比如對(duì)方法的調(diào)用順序的判斷等。
結(jié)構(gòu)示意圖如下:
各角色定義如下:
Facade:門(mén)面角色浴滴,客戶(hù)端可以調(diào)用這個(gè)角色的方法拓萌。此角色知曉子系統(tǒng)的所有功能和責(zé)任。一般情況下本角色將所有從客戶(hù)端發(fā)來(lái)的請(qǐng)求委派到相應(yīng)的子系統(tǒng)中去巡莹,并沒(méi)有具體的業(yè)務(wù)邏輯司志。
Subsystem 子系統(tǒng)角色:可同時(shí)擁有一個(gè)或者多個(gè)子系統(tǒng),每個(gè)子系統(tǒng)都不是一個(gè)單獨(dú)的類(lèi)降宅,而是一個(gè)集合骂远。子系統(tǒng)并不知道門(mén)面了ide存在。對(duì)于子系統(tǒng)而言腰根,門(mén)面類(lèi)僅僅是一個(gè)客戶(hù)端而言激才。
門(mén)面模式的優(yōu)點(diǎn):
1、減少系統(tǒng)間的相互依賴(lài):如果不使用門(mén)面模式,那么外部直接訪問(wèn)子系統(tǒng)內(nèi)部瘸恼,就是直接依賴(lài)子系統(tǒng)的類(lèi)劣挫,形成強(qiáng)耦合。而使用了門(mén)面模式东帅,客戶(hù)端就只與門(mén)面類(lèi)Facade一個(gè)類(lèi)依賴(lài)压固。
2、提高了靈活性:減少了依賴(lài)靠闭,靈活性自然就提高了帐我,子系統(tǒng)內(nèi)部不管如何變化,只要不影響門(mén)面類(lèi)愧膀,那么久任你改變拦键。
3、提高了安全性:封裝了子系統(tǒng)的方法檩淋,有門(mén)面類(lèi)來(lái)控制芬为,門(mén)面類(lèi)告訴你哪些方法你就能訪問(wèn)哪些,而不是所有的子系統(tǒng)的方法蟀悦。
門(mén)面模式的缺點(diǎn):
1媚朦、不符合開(kāi)閉原則,有改動(dòng)只能修改門(mén)面類(lèi)熬芜,而不能使用繼承莲镣、覆寫(xiě)等方式。
門(mén)面類(lèi)的使用場(chǎng)景:
1涎拉、為一個(gè)復(fù)雜的模塊或子系統(tǒng)提供一個(gè)外界訪問(wèn)的接口
2瑞侮、子系統(tǒng)相對(duì)獨(dú)立,外界對(duì)子系統(tǒng)的訪問(wèn)黑箱操作集合