用C++跟你聊聊“外觀模式”

在這裏插入圖片描述

從買股票的故事說起

新手接觸股票時,總是容易虧錢,不論是熊市還是牛市。

爲啥嘞,作爲一個外行人,我覺得新手散戶需要有莫大的勇氣和智慧去面對種類繁多的個股,一不小心就跌了跟頭。

那爲什麼不找個專業人士帶呢?比如把錢放進基金。我知道,賺的少嘛。如果是我,我會選擇放基金,自己買一支學習股。畢竟人家是專業的,我們沒必要用我們的業餘去挑戰人家吃飯的本事。

軟件開發,程序編寫的過程,又何嘗不似這股票買賣,我們就是散戶,面對一大堆的接口,我們難免要頭皮發麻然後“賠本離場”。那麼,有沒有什麼好的辦法,就像找一個基金代理人那樣?有的,那就是外觀模式。

外觀模式UML

在這裏插入圖片描述

示例代碼

#include<iostream>

using namespace std;

class Stock1 {
public:
	void sell() { cout << "股票1賣出" << endl; }
	void buy() { cout << "股票1買入" << endl; }
};

class Stock2 {
public:
	void sell() { cout << "股票2賣出" << endl; }
	void buy() { cout << "股票2買入" << endl; }
};
class Stock3 {
public:
	void sell() { cout << "股票3賣出" << endl; }
	void buy() { cout << "股票3買入" << endl; }
};

class Funk {
private:
	Stock1 *gu1;
	Stock2* gu2;
	Stock3* gu3;
public:
	Funk() {
		gu1 = new Stock1();
		gu2 = new Stock2();
		gu3 = new Stock3();
	}

	void buy() {
		gu1->buy();
		gu2->buy();
		gu3->buy();
	}

	void sell() {
		gu1->sell();
		gu2->sell();
		gu3->sell();
	}
};

int main()
{
	Funk* my_funk = new Funk();
	my_funk->buy();
	my_funk->sell();

	return 0;
}

我在嗶嗶兩句

這平淡無奇的代碼設計,卻無法掩蓋住外觀模式的光芒。幾乎每個項目開發、軟件設計都要用到外觀設計。

可能會覺得是固定代碼的堆砌,死代碼。但是我想舉個栗子,就算是cout<<" "<<endl;這樣的打印函數,它右何嘗不是外觀模式的體現呢?
不開玩笑,如果你不用這些外觀模式打包好的接口iucn,大可以自己去調用底層函數,怕是連頭文件都要找不到吧哈哈哈。

外觀的優勢

外觀模式的優點非常顯而易見,對客戶屏蔽了內部系統實現,客戶的接入成本大大降低,耦合度也變得簡單。並且,子系統的變更,對客戶的影響也降低,雖然用戶也需要修改代碼,但是大多時候只需要修改外觀即可。同時,外觀模式雖然提供了一個統一的入口,但並不妨礙用戶直接使用子系統,使用更加複雜的功能。當然,凡事有利必有弊,外觀設計模式存在什麼問題呢?雖然外觀模式提供了一個入口,但是並不能阻止業務方直接調用子系統,可能會給人這樣一種感覺,業務方一定是這麼用的,不會產生bug,從而讓人麻痹,所以,使用外觀模式,同時也要對子系統做好保護。其次,外觀模式實際上違背了設計模式中的開閉原則,如果我們要修改業務邏輯,常常業務方也需要進行代碼修改。那麼,什麼樣的情況下適合使用外觀模式呢?如果我們的調用方用到的場景都是一樣的,但我們的子系統又非常地複雜,我們可以考慮封一個外觀,讓業務方更容易接入。

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