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

1352

被折叠的 条评论
为什么被折叠?



