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

2020-08-26 10:55:29 浏览数 (1)

从买股票的故事说起

新手接触股票时,总是容易亏钱,不论是熊市还是牛市。

为啥嘞,作为一个外行人,我觉得新手散户需要有莫大的勇气和智慧去面对种类繁多的个股,一不小心就跌了跟头。

那为什么不找个专业人士带呢?比如把钱放进基金。我知道,赚的少嘛。如果是我,我会选择放基金,自己买一支学习股。毕竟人家是专业的,我们没必要用我们的业余去挑战人家吃饭的本事。

软件开发,程序编写的过程,又何尝不似这股票买卖,我们就是散户,面对一大堆的接口,我们难免要头皮发麻然后“赔本离场”。那么,有没有什么好的办法,就像找一个基金代理人那样?有的,那就是外观模式。

外观模式UML

示例代码

代码语言:javascript复制
#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,从而让人麻痹,所以,使用外观模式,同时也要对子系统做好保护。其次,外观模式实际上违背了设计模式中的开闭原则,如果我们要修改业务逻辑,常常业务方也需要进行代码修改。那么,什么样的情况下适合使用外观模式呢?如果我们的调用方用到的场景都是一样的,但我们的子系统又非常地复杂,我们可以考虑封一个外观,让业务方更容易接入。

0 人点赞