定義:外觀模式定義了一個將子系統的一組接口集成在一起的高層接口,以提供一個一致的界面。通過這個界面,其它系統可以方便地調用子系統中的功能,而忽略子系統內部發生的變化。
使用場景:
- 爲一個比較複雜的子系統提供一個簡單的接口;
- 將客戶程序與子系統的實現部分分離,提高子系統的獨立性、可移植性;
- 簡化子系統間的依賴關係。
外觀是一個能爲子系統和客戶提供簡單接口的類。當正確的應用外觀,客戶不再直接和子系統中的類交互,而是與外觀交互。外觀承擔與子系統中類交互的責任。實際上,外觀是子系統與客戶的接口,這樣外觀模式降低了子系統和客戶的耦合度。
如下圖:
從圖中我們可以看到:外觀對象隔離了客戶和子系統對象,從而降低了耦合度。
上面講的可能很專業化,沒關係,我們通俗的來講一遍。
外觀模式就是將你經常調用的n個類,集合到一個類中進行處理;當你需要調用時,只需要調用該類就行了,而不必要再去一個一個的調用那n個類了,節省了一大步驟。
我們舉一個例子:
假如週末放假兩天,你希望固定每個週六吃番茄炒蛋,週日吃酸菜魚。
那麼我想你週六會先去買番茄和雞蛋,然後再煮來吃。
週日也是一樣,先去買酸菜和魚,然年後再煮來吃。
假如你是一個很懶的人,你不想做那麼多步驟,就只想立刻吃到,那麼有什麼方法可以直接幫你省略掉買菜和做菜的過程呢?當然是有的!你可以去餐廳裏吃。
好比如下圖:
我們可以通過餐廳類去調用自己需要實現的類。
這時候就是運用到了外觀模式,餐廳就是外觀類。把複雜的過程封裝到外觀類內部,用戶不再關心內部實現,而是簡單的調用即可!
實現代碼:
番茄類
class Tomato {
public:
void tomato() {
cout << "---番茄---" << endl;
}
};
雞蛋類
class Egg {
public:
void egg() {
cout << "---雞蛋---" << endl;
}
};
酸菜類
class ChineseSauerkraut {
public:
void chineseSauerkraut() {
cout << "---酸菜---" << endl;
}
};
魚類
class Fish {
public:
void fish() {
cout << "---魚---" << endl;
}
};
烹飪類
class Cook {
public:
void cook() {
cout << "菜做好了,開吃吧!" << endl;
}
};
餐廳類
class DiningRoom {
public:
// 番茄炒蛋
void tomatoFryEgg() {
_tomato.tomato();// 番茄
_egg.egg(); // 雞蛋
_cook.cook(); // 做菜
}
// 酸菜魚
void chineseSauerkrautFish() {
_chineseSauerkraut.chineseSauerkraut(); // 酸菜
_fish.fish(); // 魚
_cook.cook(); // 做菜
}
private:
Tomato _tomato;
Egg _egg;
ChineseSauerkraut _chineseSauerkraut;
Fish _fish;
Cook _cook;
};
客戶端調用
DiningRoom diningRoom;
cout << "週六點餐:" << endl;
diningRoom.tomatoFryEgg(); // 番茄炒蛋
cout << "===============" << endl;
cout << "週日點餐:" << endl;
diningRoom.chineseSauerkrautFish(); // 酸菜魚
運行截圖:
總結:
應用外觀模式是一個很好的設計,它可以降低客戶和子系統組件(Address、Account和CreditCard)之間的耦合度。
應用外觀模式,定義一個外觀類CustomerFacade 。它爲由客戶數據處理類(Address、Account和CreditCard)所組成的子系統提供一個高層次的、簡單的接口。