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

碼農充電站發表於2021-01-05

公號:碼農充電站pro
主頁:https://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

相關文章