设计模式学习系列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

http://baike.baidu.com/link?url=eqqZ8MQJ42BwkYKYOs-HHBk3HjD4eEQyxgr2gmO0YYgB-vMhmiK4nEfA4ofP6Qz5tMXSuqGt0EGcH21oVhKu7K

原文地址:https://www.cnblogs.com/zsb517/p/3417691.html