第八章 Caché 設(shè)計模式 外觀模式

第八章 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ā)我一起參考下龄寞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汤功,隨后出現(xiàn)的幾起案子物邑,更是在濱河造成了極大的恐慌,老刑警劉巖滔金,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件色解,死亡現(xiàn)場離奇詭異,居然都是意外死亡餐茵,警方通過查閱死者的電腦和手機科阎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忿族,“玉大人锣笨,你說我怎么就攤上這事〉琅” “怎么了错英?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屹徘。 經(jīng)常有香客問我,道長衅金,這世上最難降的妖魔是什么噪伊? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮氮唯,結(jié)果婚禮上鉴吹,老公的妹妹穿的比我還像新娘。我一直安慰自己惩琉,他們只是感情好豆励,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般良蒸。 火紅的嫁衣襯著肌膚如雪技扼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天嫩痰,我揣著相機與錄音剿吻,去河邊找鬼。 笑死串纺,一個胖子當著我的面吹牛丽旅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纺棺,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼榄笙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祷蝌?” 一聲冷哼從身側(cè)響起茅撞,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杆逗,沒想到半個月后乡翅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡罪郊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年蠕蚜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悔橄。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡靶累,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癣疟,到底是詐尸還是另有隱情挣柬,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布睛挚,位于F島的核電站邪蛔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扎狱。R本人自食惡果不足惜侧到,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淤击。 院中可真熱鬧匠抗,春花似錦、人聲如沸污抬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矢腻,卻和暖如春门驾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背踏堡。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工猎唁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顷蟆。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓诫隅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帐偎。 傳聞我的和親對象是個殘疾皇子逐纬,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 生活中的示例## 外觀模式在現(xiàn)實生活中的示例很多,比如:組裝電腦削樊,通常會有兩種方案豁生。 一個...
    七寸知架構(gòu)閱讀 6,251評論 7 57
  • 原文傳送門 1 介紹 外觀模式又稱為門面模式,它是一種對象結(jié)構(gòu)型模式漫贞。外觀模式是迪米特法則的一種具體實現(xiàn)甸箱,通過引入...
    dd299閱讀 441評論 0 1
  • 文摘一:有些地方外觀模式也被叫做門面模式,英文即Facade Pattern迅脐,提前說明一下芍殖。 試想這種情況,用戶添...
    _淺墨_閱讀 484評論 0 1
  • 一谴蔑、模式定義 外觀模式(Facade Pattern):外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的外觀對象進行豌骏,為子...
    QuantRuu閱讀 737評論 0 50
  • 今天早上起床后,閨女換好衣服然后去刷牙洗臉隐锭。吃過飯窃躲,七點十五從家里出發(fā)去學校,到了學校東面钦睡,由于今天是教...
    童鞋專賣閱讀 223評論 0 0