当系统的数据和行为都正确,但是接口不符合使用要求时,我们应该考虑使用适配器模式,目的是控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。在使用C++的情况下我们可以利用C++的多重继承实现类适配器模式,另一个是对对象适配器模式。《设计模式》中如此描述适配器模式:
适配器模式(Adapter)将一个类的接口转换成为客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
1.模式适用性
- 使用一个已经存在的类,但他的接口(函数原型)和你的要求不相同时
- 两个类所作的事情相同或相似,但是具有不同的接口时
2.模式结构
(1)Target:Client所希望使用的接口–Request()。
(2)Adapter:适配器,封装一个Adaptee,将其接口转化为客户可用的接口。
(3)Adaptee:适配对象,可以完成Client所需的功能,但是接口不一致所以需要适配。
3.实现
#include <iostream>
using namespace std;
class Target
{
public:
virtual ~Target(){ }
virtual void Request()
{
cout << "Normal request" << endl;
}
};
class Adaptee
{
public:
virtual ~Adaptee(){}
void SpecificRequest()
{
cout << "Specific request" << endl;
}
};
class Adapter : public Target
{
private:
Adaptee *adaptee;
public:
Adapter(){adaptee = new Adaptee();}
virtual ~Adapter(){delete adaptee;}
virtual void Request()
{
adaptee->SpecificRequest();
}
};
int main()
{
Target *target = new Adapter();
target->Request();
delete target;
return 0;
}
4.总结
生活中有许多适配器的例子,如充电器,他们的功能是一致的,都是为手机充电,而可能买的水货手机的接头无法在我们国家的插座上使用,这时就需要适配器了。程序服用也是如此,我们需要一致的接口,而可用的代码与我们的预期接口不一致,这时就可以使用适配器模式来解决这个问题。正确的使用适配器有如下有点:
- 适配器完成的接口转化的问题,对客户来说是透明的
- 无需修改两者接口,便可完成接口不一致问题