C++实现26种设计模式之——适配器模式

C++实现26种设计模式之——适配器模式


谨以此系列文,纪念被设计模式整懵逼的那些年。
笔者没看过设计模式书,仅仅在工作中用过26种设计模式中的几种,其余大部分都是看demo代码。所以有错漏的地方,请各位兄弟批评指正!!
而代码是年前大佬甩给我的,当时没时间细究,现在终于闲下来好好研究了,所以demo代码从哪儿下的笔者也不知(对那位写下的demo的老兄表示感谢和歉意,真心不是侵权)。
而学习间,笔者亦将demo代码改了许多,感谢开源,回馈开源,笔者接下来的代码也全部贴出,不用下载。

先看运行

以结果为导向,来看待问题,会清晰得多:
在这里插入图片描述
但这个三角头插入并不容易,因为整个家里,居然全是两脚插!!并没有三脚插啊!!!
怎么办?只能去买个转接头,转接头长得就像这种:
在这里插入图片描述
左边的,是露在外面的,能给客户看到的,噢,是两脚插,家里可以插了。
右边的,是隐藏在里面的,客户看不到的,三角插。
所以,适配器模式就是这个意思了:
有一个类,三角插,main函数看不到,而main能看到的就是两脚插,但是又要能插出三角插的效果(如上图运行结果),肿么办呢?先看看main函数怎么写的。

再来看main函数:

int main()
{
	TwoFeetOutlet* outlet = new Adapter;
	outlet->plugging();
	system("pause");
}

outlet是两脚插的类型,new了一个适配器出来,结果插上去,就是三角插了。
想到这里,大概也能猜到实现的原理了:
无非就是在Adapter内部调用了ThreeFeetOutlet三角插的plugging罢了!怎么调用?当然是把ThreeFeetOutlet作为Adapter的成员啦!

完整源码

#include "pch.h"
#include <iostream>

using namespace std;

class ThreeFeetOutlet {
public:
	ThreeFeetOutlet() {}
	~ThreeFeetOutlet() {}

	virtual void plugging() {
		cout << "三脚插头插入啦!" << endl;
	}
};

class TwoFeetOutlet {
public:
	TwoFeetOutlet() {}
	~TwoFeetOutlet() {}

	virtual void plugging() {
		cout << "两脚插头插入啦!";
	}
};

class Adapter : public TwoFeetOutlet {
public:
	Adapter(){ m_outlet = new ThreeFeetOutlet; }//类适配器
	Adapter(ThreeFeetOutlet* outlet) { m_outlet = outlet; }//对象适配器
	~Adapter() { delete m_outlet; }

	void plugging() {
		m_outlet->plugging();
	}

private:
	ThreeFeetOutlet* m_outlet;

};

int main()
{
	TwoFeetOutlet* outlet = new Adapter;
	outlet->plugging();
	system("pause");
}

补充

以上这个,叫做:类适配器。
所以,还有另外一种叫做:对象适配器。
两者啥差别,看代码就知道了。
类适配器的适配器构造是这样的:

Adapter(){m_outlet = new ThreeFeetOutlet;}

而对象适配器的适配器构造是这样的:

Adapter(ThreeFeetOutlet* outlet) { m_outlet = outlet; }

是不是一目了然?
类适配器就是整个类都被适配了,对象就是只针对部分对象,你想让哪个对象适配,就把那个对象传进构造呗。
不过,说到这里,肯定想问,那还要适配器干啥噢!多此一举!
那只能这么回答:如果家里并不是全部都是两脚插,要是单单剩一个三角插呢?嘻嘻……

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值