外觀模式-簡化子系統的複雜性
公號:碼農充電站pro
主頁://codeshellme.github.io
今天來介紹外觀模式(Facade Design Pattern)。
1,外觀模式
外觀模式又叫門面模式,它提供了一個統一的(高層)接口,用來訪問子系統中的一群接口,使得子系統更容易使用。
外觀模式的類圖如下:
Facede 簡化了原來的非常複雜的子系統,使得子系統更易使用,Client 只需依賴 Facede 即可。
雖然有了 Facede ,但 Facede 並影響原來的子系統,也就是其它客戶依然可以使用原有系統。
2,最少知識原則
最少知識原則告訴我們,應該盡量減少對象之間的交互,只與自己最需要的接口建立關係。
在設計系統時,不應該讓太多的類耦合在一起,以免一小部分的改動,而影響到整個系統的使用。
這也就是我們俗話說的:牽一髮而動全身,最少知識原則的就是讓我們避免這種情況的發生。
外觀模式則使用了最少知識原則。
3,外觀模式舉例
下面舉一個簡單的例子,來體會下外觀模式的使用。俗話說:民以食為天。我們來舉一個吃飯的例子。
話說,小明每次吃飯都要經過以下步驟:
- 去超市買菜。
- 回到家後,洗菜。
- 炒菜。
- 煮飯。
- 將飯菜盛到碗里。
- 吃飯。
- 洗碗。
可見小明吃一頓飯真的很麻煩。
我們用代碼來模擬上面的過程,首先創建了三個類,分別是關於菜,飯,碗的操作:
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,總結
外觀模式主要用於簡化系統的複雜度,為客戶提供更易使用的接口,減少客戶對複雜系統的依賴。
從外觀模式中我們也能看到最少知識原則的運用。
(本節完。)
推薦閱讀:
歡迎關注作者公眾號,獲取更多技術乾貨。