适配器模式:
电压适配器能将220v的电压,调整到手机充电要求的的5v电压,所以称之为适配器。
1 在软件开发过程中,如果某个模块的功能开发起来非常困难,但是此前已经有相同功能的模块存在了,只是这两个模块的接口不一致,利用适配器模式就能够用目标接口封装好已经存在的接口,降低开发的难度。适配器模式可以实现对现有类(功能)的包装,直接使用,而不必重新开发。
2 调用者和提供者都不太容易修改的情况下,使用适配器模式。
3 适配器模式可以通过类的组合或者类的私有继承来实现。
类组合方式:对象适配器
#include<iostream> using namespace std; class Target{//含目标接口的类 public: virtual ~Target()=0; virtual void request()=0; }; Target::~Target(){//纯虚析构函数必须定义! } class Adaptee{//需要适配的类 public: void specialRequest(){ cout<<"Adaptee::specialRequest()"<<endl; } }; class Adapter:public Target{//适配器 public: Adapter(){ pAdaptee=new Adaptee(); } ~Adapter(){ delete pAdaptee; pAdaptee=NULL; } void request() override{ cout<<"Adapter::request()"<<endl; pAdaptee->specialRequest(); } private: Adaptee* pAdaptee; }; int main(){ Target* aTarget=new Adapter(); aTarget->request(); delete aTarget; aTarget=NULL; }
#include<iostream> using namespace std; class Target{ public: virtual ~Target()=0; virtual void request()=0; }; Target::~Target(){//纯虚析构函数必须定义 } class Adaptee{ public: void specialRequest() { cout<<"Adaptee::specialRequest()"<<endl; } }; class Adapter:public Target,private Adaptee{ public: void request() override{ cout<<"Adapter::request()"<<endl; Adaptee::specialRequest(); } }; int main(){ Target* aTarget=new Adapter(); aTarget->request(); }
1 采用私有继承,如果在Adaptee中添加一个纯虚函数,那么子类Adapter也要对这个纯虚函数进行重定义,这样子就增加了类的耦合。
2 私有继承时,Adapter类内无法对Adaptee的子类中的方法进行调用。而采用类的组合方式,可以在Adapter类内声明一个Adaptee的指针,通过动态绑定的方式调用Adaptee的子类。
所以,尽量使用类组合的对象适配器,而不是多继承的类适配器。