设计模式学习系列8 适配器模式
概论
说到适配器想到最多的是电源适配器笔记本电源是220V交流转换为12V直流电适配器,手机充电器是交流220V转换为5V直流适配器,机械上也经常使用中间齿轮来耦合;另外两个齿轮,等等。
软件中的适配器主要为客户要提供原先类没不存在的接口或者方法,从而解决接口不兼容的问题。设计模式主要提供两种实现方法 类适配器 和 对象适配器
模式图
(1)类适配器
类适配器通过多重继承的方法实现,适配器类Adapter继承Target和Adaptee 两个类的接口,然后做出转换。
但是对于C++而言,多重继承有很多风险,很多人不建议使用
(2)对象适配器
对象适配器使用包含的方式实现,Adapter类从目标接口中继承request()方法,并且保存一个Adaptee类的对象指针,重写request()方法的时候调用Adaptee类的特殊接口。
这种方式提供了一定的灵活性,可以通过Adaptee类的子类进行扩展;
C++实现
//适配器模式,适合与接口转换
#include<iostream>
using namespace std;
//目标接口,也就是现在使用的接口
class Target
{
public:
void Request()
{
cout << "目标接口" << endl ;
}
};
//原先存在的接口
class Adaptee
{
public :
void SpRequest()
{
cout << "特殊接口" << endl ;
}
};
//对象适配器
class Adapter
{
private:
//可以使用多种方式提供对象指针,这里类内部直接NEW
Adaptee* m_src ;
public:
Adapter(Adaptee *p)
{
m_src = p ;
}
void Request()
{
cout << "对象适配器" << endl ;
m_src->SpRequest();
}
} ;
//类适配器
class ClassAdapter :public Target,public Adaptee
{
public:
void Request()
{
cout << "类适配器" << endl ;
SpRequest();
}
};
int main()
{
Adaptee *pSrc = new Adaptee ;
Target *pDst = new Target ;
//类对象适配器
Adapter *pAdapter = new Adapter(pSrc);
pAdapter->Request();
cout <<"=========================" <<endl ;
ClassAdapter *pClassAdapter = new ClassAdapter;
pClassAdapter->Request();
return 1 ;
}
总结
适配器模式将不符合要求的接口转换为需求接口,而不是通过改变接口,符合面向对象的OC原则,但是在实际应用中似乎不太可能去为每一个类增加一个这样的接口,太麻烦了。
对于两种实现方式,对象适配器只需要继承目标类的接口,耦合度降低了,并且类适配器更加灵活,可以通过子类进行扩展,也可以在接口中对多个类进行处理。
参考
http://www.cnblogs.com/ASPNET2008/archive/2009/02/02/1380619.html