UML类图(仅供参考)如下:
适配器模式解决的问题:
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
源码
#include <iostream>
// 目标类,就是用户最终需要的类
class CTarget
{
public:
CTarget() {}
virtual ~CTarget() {}
// 标准接口(也就是用户最终想要的接口)
virtual void Request() = 0;
};
// 需要适配的类,这个类的功能使用户需要的
class CAdaptee
{
public:
CAdaptee() {}
virtual ~CAdaptee() {}
// 提供给用户的接口,但是不是用户所期待的样子
void SpecificRequest()
{
std::cout << "CAdaptee::SpecificRequest()" << std::endl;
}
};
// 适配类(类模式),通过public继承获得接口继承的效果,通过private继承获得实现继承的效果
class CAdapter1 :public CTarget, private CAdaptee
{
public:
CAdapter1() {}
~CAdapter1() {}
// 这就是适配器存在的意义,根据已有功能实现用户期望的接口
virtual void Request()
{
std::cout << "CAdapter1::Request()" << std::endl;
SpecificRequest();
std::cout << "----------------------------" << std::endl;
}
};
// 适配器类(对象模式),继承Target类,采用组合的方式实现Adaptee的复用
class CAdapter2 :public CTarget
{
public:
// 可以采用多种方式得到功能类
CAdapter2() :_pAdaptee(new CAdaptee) {};
CAdapter2(CAdaptee *pAdaptee) :_pAdaptee(pAdaptee) {}
~CAdapter2() {};
// 这就是适配器存在的意义,根据已有功能实现用户期望的接口
virtual void Request()
{
std::cout << "CAdapter2::Request()" << std::endl;
_pAdaptee->SpecificRequest();
std::cout << "----------------------------" << std::endl;
}
private:
CAdaptee *_pAdaptee;
};
// 测试
int main()
{
CTarget *pTarget1 = new CAdapter1();
pTarget1->Request();
CTarget *pTarget2 = new CAdapter2();
pTarget2->Request();
CAdaptee *pAdaptee = new CAdaptee();
CTarget *pTarget3 = new CAdapter2(pAdaptee);
pTarget3->Request();
}
好处
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好