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

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

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

1,外觀模式

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

外觀模式的類圖如下:

在這裡插入圖片描述

Facede 簡化了原來的非常複雜的子系統,使得子系統更易使用,Client 只需依賴 Facede 即可。

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

2,最少知識原則

最少知識原則告訴我們,應該盡量減少對象之間的交互,只與自己最需要的接口建立關係。

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

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

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

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