设计模式之适配器模式(Adapter)
适配器模式
1.作用
(1)软件复用
将某个类的接口转换成另一个客户期待的接口
(2)接口转换
实现了接口不匹配的类间通信,兼容性
2.类图
代码实现如下:
(1)通过子对象实现
# include <iostream>
using namespace std;
class Adaptee{
public :
void Adapteepro(){
cout<<"这是Adaptee实现的方法"<<endl;
}
};
class Adapter{
private:
Adaptee objAdaptee;
public :
void Adapterpro(){
objAdaptee.Adapteepro();
}
};
int main(void){
Adapter objAdapter;
objAdapter.Adapterpro();
}
运行结果如下:
这是Adaptee实现的方法
(2)通过指针实现
# include <iostream>
using namespace std;
class Adaptee{
public:
void Adapteepro(){
cout<<"这是Adaptee的实现方法"<<endl;
}
};
class Adapter{
private:
Adaptee*adaptee;
public:
Adapter(Adaptee *t){
adaptee=t;
}
void Adapterpro(){
adaptee->Adapteepro();
}
~Adapter(){
cout<<"这是Adapter的析构函数"<<endl;
delete adaptee;
cout<<"释放了adaptee"<<endl;
}
};
int main(void){
Adaptee *adaptee=new Adaptee();
Adapter *adapter=new Adapter(adaptee);
adapter->Adapterpro();
delete adapter;
cout<<"释放了adapter"<<endl;
}
运行结果如下:
这是Adaptee的实现方法
这是Adapter的析构函数
释放了adaptee
释放了adapter
注:
先释放了adaptee,再释放了adapter
内部理解图如下:
3.适配器模式实例
(1)类图
Adaptee中的method方法是带参函数
而Adapter中的method方法不带参数,整个继承体系也都不带参数
为了保证多态体系的存在,进行适配器模式
代码实现如下
# include <iostream>
using namespace std;
class Adaptee{
public:
void method(int n){
cout<<"Adaptee n="<<n<<endl;
}
};
class AdapterBase{
public:
virtual void method()=0;
virtual ~AdapterBase(){
cout<<"这是AdapterBase的析构函数"<<endl;
}
};
class AdapterA :public AdapterBase{
public:
void method(){
cout<<"这是AdapterA的method"<<endl;
}
~AdapterA(){
cout<<"这是AdapterA的析构函数"<<endl;
}
};
class AdapterB :public AdapterBase{
private:
Adaptee *adaptee;
public:
AdapterB(){
adaptee=new Adaptee();
}
void method(){
cout<<"这是AdapterB的method"<<endl;
adaptee->method(6);
}
~AdapterB(){
cout<<"这是AdapterB的析构函数"<<endl;
}
};
class AdapterC :public AdapterBase{
public:
void method(){
cout<<"这是AdapterC的method"<<endl;
}
~AdapterC(){
cout<<"这是AdapterC的析构函数"<<endl;
}
};
int main(void){
AdapterB *pb=new AdapterB();
pb->method();
}
运行结果如下:
这是AdapterB的method
Adaptee n=6