适配器模式:
电压适配器能将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的子类。
所以,尽量使用类组合的对象适配器,而不是多继承的类适配器。