外觀模式-簡化子系統的複雜性

公號:碼農充電站pro
主頁:https://codeshellme.github.iohtml

今天來介紹外觀模式Facade Design Pattern)。java

1,外觀模式

外觀模式又叫門面模式,它提供了一個統一的(高層)接口,用來訪問子系統中的一羣接口,使得子系統更容易使用。git

外觀模式的類圖以下:github

在這裏插入圖片描述

Facede 簡化了原來的很是複雜的子系統,使得子系統更易使用,Client 只需依賴 Facede 便可。算法

雖然有了 Facede ,但 Facede 並影響原來的子系統,也就是其它客戶依然能夠使用原有系統。shell

2,最少知識原則

最少知識原則告訴咱們,應該儘可能減小對象之間的交互,只與本身最須要的接口創建關係。this

在設計系統時,不該該讓太多的類耦合在一塊兒,以避免一小部分的改動,而影響到整個系統的使用。設計

這也就是咱們俗話說的:牽一髮而動全身,最少知識原則的就是讓咱們避免這種狀況的發生。code

外觀模式則使用了最少知識原則。htm

3,外觀模式舉例

下面舉一個簡單的例子,來體會下外觀模式的使用。俗話說:民以食爲天。咱們來舉一個吃飯的例子。

話說,小明每次吃飯都要通過如下步驟:

  1. 去超市買菜。
  2. 回到家後,洗菜。
  3. 炒菜。
  4. 煮飯。
  5. 將飯菜盛到碗裏。
  6. 吃飯。
  7. 洗碗。

可見小明吃一頓飯真的很麻煩。

咱們用代碼來模擬上面的過程,首先建立了三個類,分別是關於菜,飯,碗的操做:

class Vegetables {
    public void bugVegetables() {
        System.out.println("buying vegetables.");
    }

    public void washVegetables() {
        System.out.println("washing vegetables.");
    }

    public void fryVegetables() {
        System.out.println("frying vegetables.");
    }

    public void toBowl() {
        System.out.println("putting the vegetables into the bowl.");
    }
}

class Rice {
    public void fryRice() {
        System.out.println("frying rice.");
    }

    public void toBowl() {
        System.out.println("putting the rice into the bowl.");
    }
}

class Bowl {
    private Vegetables vegetables;
    private Rice rice;

    public Bowl(Vegetables vegetables, Rice rice) {
        this.vegetables = vegetables;
        this.rice = rice;
    }

    // 盛好飯菜
    public void prepare() {
        vegetables.toBowl();
        rice.toBowl();
    }

    public void washBowl() {
        System.out.println("washing bowl.");
    }
}

小明每次吃飯都須要與上面三個類作交互,並且須要不少步驟,以下:

Vegetables v = new Vegetables();
v.bugVegetables();
v.washVegetables();
v.fryVegetables();

Rice r = new Rice();
r.fryRice();

Bowl b = new Bowl(v, r);
b.prepare();

System.out.println("xiao ming is having a meal.");

b.washBowl();

後來,小明請了一位保姆,來幫他作飯洗碗等。因此咱們建立了 Nanny 類:

class Nanny {
    private Vegetables v;
    private Rice r;
    private Bowl b;

    public Nanny() {
        v = new Vegetables();
        r = new Rice();
        b = new Bowl(v, r);
    }

    public void prepareMeal() {
        v.bugVegetables();
        v.washVegetables();
        v.fryVegetables();

        r.fryRice();

        b.prepare();
    }

    public void cleanUp() {
        b.washBowl();
    }
}

這樣,小明再吃飯的時候就只須要跟保姆說一聲,保姆就幫他作好了全部的事情:

Nanny n = new Nanny();
n.prepareMeal();

System.out.println("xiao ming is having a meal.");

n.cleanUp();

這樣大大簡化了小明吃飯的步驟,也節約了不少時間。

我將完整的代碼放在了這裏,供你們參考。

4,總結

外觀模式主要用於簡化系統的複雜度,爲客戶提供更易使用的接口,減小客戶對複雜系統的依賴。

從外觀模式中咱們也能看到最少知識原則的運用。

(本節完。)


推薦閱讀:

策略模式-定義一個算法族

觀察者模式-將消息通知給觀察者

裝飾者模式-動態的包裝原有對象的行爲

命令模式-將請求封裝成對象

適配器模式-讓不兼容的接口得以適配


歡迎關注做者公衆號,獲取更多技術乾貨。

碼農充電站pro

相關文章
相關標籤/搜索