第八章 Caché 設(shè)計模式 外觀模式
定義
為子系統(tǒng)的一組接口提供一個一致的界面册着,此模式定義了一個高層接口斟冕,這個接口使得這一子系統(tǒng)更加容易使用荧琼。
優(yōu)點
- 減少系統(tǒng)的相互依賴丽惶,所以的依賴都是對外觀類的依賴炫七,與子系統(tǒng)無關(guān)。
- 對用戶隱藏了子系統(tǒng)的具體實現(xiàn)钾唬,減少用戶對子系統(tǒng)的耦合万哪,這樣即使具體的子系統(tǒng)發(fā)生了變化,用戶也感知不到抡秆。
- 加強了安全性奕巍,子系統(tǒng)中的方法如果不在外觀類中開通,就無法訪問到子系統(tǒng)中的方法儒士。
缺點
- 不符合開放封閉原則的止,如果業(yè)務(wù)出現(xiàn)變更,則可能要直接修改外觀類
使用場景
- 構(gòu)建一個有層次結(jié)構(gòu)的子系統(tǒng)時着撩,使用外觀模式定義子系統(tǒng)中每層的入口點诅福。
- 如果子系統(tǒng)之間是相互依賴的匾委,則可以讓其通過外觀接口進行通信,減少子系統(tǒng)之間的依賴關(guān)系氓润。
- 子系統(tǒng)往往會因為不斷的重構(gòu)演化而變得越來越復雜赂乐,大多數(shù)的模式使用也會產(chǎn)生很多很小的類,這給外部調(diào)用他們的用戶程序帶來了使用上的困難咖气。
- 我們可以使用外觀類提供一個簡單的接口挨措,對外隱藏子系統(tǒng)的具體實現(xiàn)并隔離變化。
- 當維護一個遺留的大型系統(tǒng)時采章,可能這個系統(tǒng)已經(jīng)非常難以維護和拓展运嗜;但因為它含有重要的功能。所以新的需要必須依賴于它悯舟,這時可以使用外觀類
- 為設(shè)計粗糙或者復雜的遺留代碼提供一個簡單的接口担租,讓新系統(tǒng)和外觀類交互,而外觀類負責與遺留的代碼進行交互抵怎。
何時使用外觀模式
- 首先奋救,在設(shè)計初期階段,應(yīng)該要有意識的將不同的兩個層分離反惕,比如經(jīng)典的三層架構(gòu)尝艘,就需要考慮在數(shù)據(jù)訪問層和業(yè)務(wù)邏輯層,業(yè)務(wù)邏輯層和表示層的層與層之間建立外觀facade姿染,這樣可以為復雜的子系統(tǒng)提供一個簡單的接口背亥,使用耦合大大降低。
- 其次悬赏,在開發(fā)階段狡汉,子系統(tǒng)往往因為為不斷的重構(gòu)演化而變得越來越復雜,大多數(shù)模式使用時也都會產(chǎn)生很多很小的類闽颇,這本是好事盾戴,但也給外部調(diào)用他們的用戶程序帶來了使用上的困難,增加外觀模式Facade可以提供一個簡單的接口兵多,減少他們之間的依賴尖啡。
- 第三,在維護一個遺留的大型系統(tǒng)時剩膘,可能這個系統(tǒng)已經(jīng)非常難以維護和擴展了衅斩,但因為它包含很多非常重要的功能,新的需求開發(fā)必須要依賴它怠褐,此時用外觀模式也是非常合適的矛渴。
- 可以為新系統(tǒng)開發(fā)一個外觀Facade類,來提供設(shè)計粗糙或高度復雜的遺留代碼的比較清晰簡單的接口,讓新系統(tǒng)與Facade對象交互具温,F(xiàn)acade與遺留代碼交互所有復雜的工作蚕涤。
結(jié)構(gòu)圖
image.png
完整示例
子系統(tǒng)類
Class PHA.YX.Design.Facade.SubSystemOne Extends %RegisteredObject
{
Method MethodOne()
{
w "子系統(tǒng)方法一",!
}
}
Class PHA.YX.Design.Facade.SubSystemTwo Extends %RegisteredObject
{
Method MethodTwo()
{
w "子系統(tǒng)方法二",!
}
}
Class PHA.YX.Design.Facade.SubSystemThree Extends %RegisteredObject
{
Method MethodThree()
{
w "子系統(tǒng)方法三",!
}
}
Class PHA.YX.Design.Facade.SubSystemFour Extends %RegisteredObject
{
Method MethodFour()
{
w "子系統(tǒng)方法四",!
}
}
外觀類
Class PHA.YX.Design.Facade.Facade Extends %RegisteredObject
{
Property mSubSystemOne As SubSystemOne;
Property mSubSystemTwo As SubSystemTwo;
Property mSubSystemThree As SubSystemThree;
Property mSubSystemFour As SubSystemFour;
Method %OnNew() As %Status [ Private, ServerOnly = 1 ]
{
s ..mSubSystemOne = ##class(SubSystemOne).%New()
s ..mSubSystemTwo = ##class(SubSystemTwo).%New()
s ..mSubSystemThree = ##class(SubSystemThree).%New()
s ..mSubSystemFour = ##class(SubSystemFour).%New()
Quit $$$OK
}
Method MethodA()
{
w "MethodA()",!
d ..mSubSystemOne.MethodOne()
d ..mSubSystemTwo.MethodTwo()
d ..mSubSystemThree.MethodThree()
}
Method MethodB()
{
w "MethodB()",!
d ..mSubSystemTwo.MethodTwo()
d ..mSubSystemThree.MethodThree()
d ..mSubSystemFour.MethodFour()
}
}
調(diào)用
/// d ##class(PHA.YX.Design.Program).Facade()
ClassMethod Facade()
{
#dim mFacade as PHA.YX.Design.Facade.Facade
s mFacade = ##class(PHA.YX.Design.Facade.Facade).%New()
d mFacade.MethodA()
w !
d mFacade.MethodB()
}
DHC-APP>d ##class(PHA.YX.Design.Program).Facade()
MethodA()
子系統(tǒng)方法一
子系統(tǒng)方法二
子系統(tǒng)方法三
MethodB()
子系統(tǒng)方法二
子系統(tǒng)方法三
子系統(tǒng)方法四
思考
有一些武林絕學,比如經(jīng)脈铣猩,內(nèi)功(九陽神功揖铜,乾坤大挪移),招式(太極拳达皿,七傷拳天吓,圣火令)。外觀隨意組合這些招數(shù)應(yīng)對不同的敵人峦椰。感興趣的同學實現(xiàn)后可以發(fā)我一起參考下龄寞。