設(shè)計模式 -- 外觀模式

場景

飯店點餐一般有倆種方式,一種是單點港华,一種是套餐,如果單點我們需要面對菜單上所有的菜午衰,如果有了套餐立宜,我只需要點一個合適的套餐就可以,因為有套餐的存在臊岸,所以客戶不需要直接對應(yīng)菜單所有的菜橙数,只與套餐交互即可,整個過程簡單省事

單點帅戒、套餐

問題來了
在軟件開發(fā)中灯帮,有時候為了完成一項較為復(fù)雜的功能,一個客戶類需要和多個業(yè)務(wù)類交互,而這些需要交互的業(yè)務(wù)類經(jīng)常會作為一個整體出現(xiàn)钟哥,由于涉及到的類比較多迎献,導(dǎo)致使用時代碼較為復(fù)雜

問題改進(jìn)
為了避免客戶類需要和多個業(yè)務(wù)類交互,需要一個類似套餐一樣的角色瞪醋,由它來負(fù)責(zé)和多個業(yè)務(wù)類進(jìn)行交互忿晕,而客戶類只需與該類交互即可

表述 (結(jié)構(gòu)型模式)

為子系統(tǒng)中的一組接口提供一個統(tǒng)一的接口。外觀模式定義了一個更高層次的接口银受,這個接口使得這一子系統(tǒng)更加容易使用

外觀模式中践盼,一個子系統(tǒng)的外部與其內(nèi)部的通信通過一個統(tǒng)一的外觀類進(jìn)行,外觀類將客戶類與子系統(tǒng)的內(nèi)部復(fù)雜性分隔開宾巍,使得客戶類只需要與外觀角色打交道咕幻,而不需要與子系統(tǒng)內(nèi)部的很多對象打交道。

外觀模式類圖

外觀模式類圖
  • Facade(外觀角色):就是表述中的“高層接口”顶霞,客戶端可以調(diào)用這個角色的方法肄程;另外,該角色知道相關(guān)的子系統(tǒng)的功能和責(zé)任
  • SubSystem(子系統(tǒng)角色):在軟件系統(tǒng)中可以有一個或者多個子系統(tǒng)角色选浑,每一個子系統(tǒng)可以不是一個單獨的類蓝厌,而是一個類的集合,它實現(xiàn)子系統(tǒng)的功能古徒;每一個子系統(tǒng)都可以被客戶端直接調(diào)用拓提,或者被外觀角色調(diào)用,它處理由外觀類傳過來的請求隧膘;子系統(tǒng)并不知道外觀的存在代态,對于子系統(tǒng)而言,外觀角色僅僅是另外一個客戶端而已

優(yōu)點

  • 它對客戶端屏蔽了子系統(tǒng)組件疹吃,減少了客戶端所需處理的對象數(shù)目蹦疑,并使得子系統(tǒng)使用起來更加容易
  • 它實現(xiàn)了子系統(tǒng)與客戶端之間的松耦合關(guān)系,這使得子系統(tǒng)的變化不會影響到調(diào)用它的客戶端萨驶,只需要調(diào)整外觀類即可

缺點

  • 不能很好地限制客戶端直接使用子系統(tǒng)類歉摧,如果對客戶端訪問子系統(tǒng)類做太多的限制則減少了可變性和靈活性

使用場景

  • 當(dāng)要為訪問一系列復(fù)雜的子系統(tǒng)提供一個簡單入口時可以使用外觀模式
  • 客戶端程序與多個子系統(tǒng)之間存在很大的依賴性。引入外觀類可以將子系統(tǒng)與客戶端解耦篡撵,從而提高子系統(tǒng)的獨立性和可移植性

示例

class ColdDish {
    func log() {
        print("涼菜")
    }
}

class HotDish {
    func log() {
        print("熱菜")
    }
}

class StapleFood {
    func log() {
        print("主食")
    }
}

class MenuPackage {
    
    var coldDish : ColdDish
    var hotDish : HotDish
    var stapleFood : StapleFood
    
    init() {
        self.coldDish = ColdDish()
        self.hotDish = HotDish()
        self.stapleFood = StapleFood()
    }
    
    func eat() {
        self.coldDish.log()
        self.hotDish.log()
        self.stapleFood.log()
    }
}

客戶端調(diào)用:

let menuPackage = MenuPackage()
menuPackage.eat()

log:
//涼菜
//熱菜
//主食
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末判莉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子育谬,更是在濱河造成了極大的恐慌,老刑警劉巖帮哈,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膛檀,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咖刃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門泳炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嚎杨,你說我怎么就攤上這事花鹅。” “怎么了枫浙?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵刨肃,是天一觀的道長。 經(jīng)常有香客問我箩帚,道長真友,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任紧帕,我火速辦了婚禮盔然,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘是嗜。我一直安慰自己愈案,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布鹅搪。 她就那樣靜靜地躺著站绪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涩嚣。 梳的紋絲不亂的頭發(fā)上崇众,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音航厚,去河邊找鬼顷歌。 笑死,一個胖子當(dāng)著我的面吹牛幔睬,可吹牛的內(nèi)容都是我干的眯漩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼麻顶,長吁一口氣:“原來是場噩夢啊……” “哼赦抖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辅肾,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤队萤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矫钓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體要尔,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡舍杜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赵辕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片既绩。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖还惠,靈堂內(nèi)的尸體忽然破棺而出饲握,到底是詐尸還是另有隱情,我是刑警寧澤蚕键,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布救欧,位于F島的核電站,受9級特大地震影響嚎幸,放射性物質(zhì)發(fā)生泄漏颜矿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一嫉晶、第九天 我趴在偏房一處隱蔽的房頂上張望骑疆。 院中可真熱鬧,春花似錦替废、人聲如沸箍铭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诈火。三九已至,卻和暖如春状答,著一層夾襖步出監(jiān)牢的瞬間冷守,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工惊科, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拍摇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓馆截,卻偏偏與公主長得像充活,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜡娶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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