《二十三種設計模式》 第二篇 “外觀模式” (C++實現)

定義:外觀模式定義了一個將子系統的一組接口集成在一起的高層接口,以提供一個一致的界面。通過這個界面,其它系統可以方便地調用子系統中的功能,而忽略子系統內部發生的變化。

使用場景:

  1. 爲一個比較複雜的子系統提供一個簡單的接口;
  2. 將客戶程序與子系統的實現部分分離,提高子系統的獨立性、可移植性;
  3. 簡化子系統間的依賴關係。

外觀是一個能爲子系統和客戶提供簡單接口的類。當正確的應用外觀,客戶不再直接和子系統中的類交互,而是與外觀交互。外觀承擔與子系統中類交互的責任。實際上,外觀是子系統與客戶的接口,這樣外觀模式降低了子系統和客戶的耦合度。
如下圖:
在這裏插入圖片描述
從圖中我們可以看到:外觀對象隔離了客戶和子系統對象,從而降低了耦合度。


上面講的可能很專業化,沒關係,我們通俗的來講一遍。

外觀模式就是將你經常調用的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)所組成的子系統提供一個高層次的、簡單的接口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章