动机(Motivation)
-
由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足。
-
如何应对这些”迁移的变化“?
模式定义
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ——《设计模式》GoF
要点总结
-
在遗留代码复用、类库迁移等方面有用
非适配器模式
缺点:
增加个欧元(ERO)的时候,对外的接口发生了变化,代码的功能需要重新写,功能也需要重新测试,违背了开闭原则。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class RMB
{
public:
void show()
{
cout << "show RMB" << endl;
}
};
class USD
{
public:
void showUSD()
{
cout << "show USD" << endl;
}
};
int main()
{
RMB *rmb = new RMB();
rmb->show();
USD *usd = new USD();
usd->showUSD();
delete rmb;
rmb = nullptr;
delete usd ;
usd = nullptr;
}
适配器模式
#include <iostream>
using namespace std;
//Target,目标
class RMB
{
public:
void show()
{
cout << "show RMB" << endl;
}
};
//Adaptee接口
class IAdaptee
{
public:
virtual void showMoney() = 0;
};
//Adaptee,需要转换的接口
class USD : public IAdaptee
{
public:
void showMoney()
{
cout << "show USD" << endl;
}
};
//扩展
class ERO : public IAdaptee
{
public:
void showMoney()
{
cout << "shwo ERO" << endl;
}
};
//Adaptor,转换适配器
//继承自目标接口,包含Adaptee,通过和目标接口相同的函数来调用Adaptee中实际功能,起到迁移的作用
class Adaptor : RMB
{
private:
IAdaptee *m_adaptee;
public:
Adaptor(IAdaptee *adaptee):m_adaptee(adaptee){}
void show()
{
m_adaptee->showMoney();
}
};
int main()
{
RMB *rmb = new RMB();
rmb->show();
USD *usd = new USD();
Adaptor *ad = new Adaptor(usd);
ad->show();
ERO *ero = new ERO();
Adaptor *ad1 = new Adaptor(ero);
ad1->show();
//delete..
}