設計模式-外觀模式

原文地址:LoveDev

外觀模式(Facade Pattern):又稱為門面模式,為一組接口提供一個統一的入口。外觀模式是迪米特法則的一種具體實現,通過引入一個新的外觀角色降低原有系統的復雜度,同時降低客戶端類與子系統的耦合度。

外觀模式
外觀模式
  • Facade(外觀角色):外觀角色中可以知道相關的多個子系統的功能和責任,客戶端調用它的方法,它再傳遞給相應的子系統對象處理
  • SubSystem(子系統角色):子系統可以不是單獨的類,而是類的集合,它實現子系統的功能,每個子系統都可以被客戶端直接調用,或者被外觀角色調用,對于子系統而言,外觀角色也是一個客戶端。

最近習慣了自己做飯,雖然做飯的過程很痛苦,可是看到自己做出來的美食后,還是很幸福很有成就感的。就拿自己做飯吃和去餐館吃飯來舉例,把餐館看做外觀角色,讓它把買菜、切菜、炒菜、刷碗這些工作統一組織起來,我要做的就是告訴他要吃什么就行了,下面是示例代碼:

SubSystem 類:

// 買菜
public class BuyVegetable {
    public void buy() {
        LogUtils.i("買菜");
    }
}

// 切菜
public class CutVegetable {
    public void cut() {
        LogUtils.i("切菜");
    }
}

// 炒菜
public class CookVegetable {
    public void cook() {
        LogUtils.i("炒菜");
    }
}

// 洗刷刷
public class WashDishes {
    public void wash() {
        LogUtils.i("洗刷刷");
    }
}

Facade 類:

// 餐館
public class Restaurant {

    private final BuyVegetable mBuyVegetable;
    private final CutVegetable mCutVegetable;
    private final CookVegetable mCookVegetable;
    private final WashDishes mWashDishes;

    public Restaurant() {
        mBuyVegetable = new BuyVegetable();
        mCutVegetable = new CutVegetable();
        mCookVegetable = new CookVegetable();
        mWashDishes = new WashDishes();
    }

    public void eat() {
        mBuyVegetable.buy();
        mCutVegetable.cut();
        mCookVegetable.cook();
        mWashDishes.wash();
    }
}

Client 類:

// 自己做飯,需要跟這些子系統交互
BuyVegetable buyVegetable = new BuyVegetable();
CutVegetable cutVegetable = new CutVegetable();
CookVegetable cookVegetable = new CookVegetable();
WashDishes washDishes = new WashDishes();
buyVegetable.buy();
cutVegetable.cut();
cookVegetable.cook();
washDishes.wash();

// 去餐館吃飯,只需跟餐館交互
Restaurant restaurant = new Restaurant();
restaurant.eat();

有了外觀模式,需要交互的類就變成了一個,讓它負責和業務類實現交互,簡化負責的交互,降低系統的耦合度,但是在標準的外觀模式中,如果需要增刪改外觀類交互的子系統類,就需要改動客戶端源碼,這樣就違反了“開閉原則”,因此遇到此類情況需要引入抽象外觀類進行優化,還以上面例子為基礎:

AbstarctFacade 類:

public abstract class AbstractFacade {
    public abstract void eat();
}

ConcreteFacade 類:

// 有些不用切就可以直接做的飯,比如面,這就需要把切菜移除掉
public class NoodlesRestaurant extends AbstractFacade{

    private final BuyVegetable mBuyVegetable;
    private final CookVegetable mCookVegetable;
    private final WashDishes mWashDishes;

    public NoodlesRestaurant() {
        mBuyVegetable = new BuyVegetable();
        mCookVegetable = new CookVegetable();
        mWashDishes = new WashDishes();
    }

    @Override
    public void eat() {
        mBuyVegetable.buy();
        mCookVegetable.cook();
        mWashDishes.wash();
    }
}

Client 類:

AbstractFacade abstractFacade = new NoodlesRestaurant();
abstractFacade.eat();

<h3> 優點 </h3>

  • 屏蔽子系統,減少客戶端所需交互的對象,簡化調用
  • 降低客戶端與子系統耦合,面對子系統變化,只需要調整外觀類即可
  • 子系統間的修改不會相互影響

<h3> 缺點 </h3>

  • 不能很好限制客戶端直接使用子系統類,對訪問子系統類做過多限制則減少可變性和靈活性
  • 設計不當時,增加新的子系統需要修改外觀類源碼,違背開閉原則

<h3> 使用場景 </h3>

  • 需要訪問一系列子系統完成業務需求
  • 客戶端和多個子系統很高的耦合,使用外觀模式解耦,提高子系統的獨立性和可移植性
  • 層次化結構中,使用外觀模式定義系統中每層的入口,層與層之間不直接產生聯系,通過外觀類建立聯系,降低層之間的耦合

源碼地址:Github

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 目錄 本文的結構如下: 什么是外觀模式 模式的結構 代碼示例 優點和缺點 適用環境 模式應用 模式擴展 補充 一、...
    w1992wishes閱讀 647評論 0 1
  • 文摘一:有些地方外觀模式也被叫做門面模式,英文即Facade Pattern,提前說明一下。 試想這種情況,用戶添...
    _淺墨_閱讀 499評論 0 1
  • 1 場景問題# 1.1 生活中的示例## 外觀模式在現實生活中的示例很多,比如:組裝電腦,通常會有兩種方案。 一個...
    七寸知架構閱讀 6,284評論 7 57
  • 介紹 現實生活中有許多外觀模式的例子,像餐館的服務員、一些企業的客戶人員、公司的前臺等等。外觀模式(Facade ...
    東西的南北閱讀 247評論 0 0
  • 今天我們來學習另一種結構型模式,它就是外觀模式(Facade Pattern)。 模式定義 外部與一個子系統的通信...
    HJXANDHMR閱讀 559評論 0 4