Adapter模式
一、意图:
将一个类的接口转换成客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
二、举例:
在应用程序中已然设计好了接口,此时使用了第三方库来加快开发,但是我们设计的接口与三方库提供的接口不一致。为了使
接口不兼容的类可以在一起工作,Adapter模式将一个类(三方库)的接口转换为客户希望的接口。
三、模式说明:
Adapter模式有两种类别:类模式和对象模式。
类模式采用继承的方式复用类Adaptee的接口,而对象模式采用组合的方式实现类Adaptee的复用。
四、C++示例:
/******************************
对象模式 ***************************///adapter.h
#ifndef ADAPTER_H
#define ADAPTER_H
class Target{
public:
Target();
virtual ~Target();
virtual void Request();
};
class Adaptee{ //作为三方库
public:
Adaptee();
~Adaptee();
virtual void SpecificRequest();
};
class Adapter : public Target{
public:
Adapter(Adaptee* ada);
~Adapter();
void Request();
private:
Adaptee* m_ada;
};
#endif // ADAPTER_H
//adapter.cpp
#include "adapter.h"
#include <iostream>
using std::cout;
using std::endl;
Target::Target(){
}
Target::~Target(){
}
void Target::Request(){
cout << "Target::Request" << endl;
}
Adaptee::Adaptee(){
}
Adaptee::~Adaptee(){
}
void Adaptee::SpecificRequest(){
cout << "Adaptee::SpecificRequest" << endl;
}
Adapter::Adapter(Adaptee* ada){
this->m_ada = ada;
}
Adapter::~Adapter(){
}
void Adapter::Request(){
m_ada->SpecificRequest();
}
//main.cpp
#include "adapter.h"
#include <iostream>
int main(int argc,char* argv[]){
Adaptee *ada = new Adaptee;
Target *aT = new Adapter(ada);
aT->Request();
return 0;
}
</pre><pre style="margin-top:0px; margin-bottom:0px"><strong><span style="font-size:14px">/</span><span style="font-size:14px; font-family:Arial,Helvetica,sans-serif"></span></strong><pre style="margin-top:0px; margin-bottom:0px; display:inline!important"><span style="font-size:14px">****************************** </span>
类模式 ***************************/
//adapter.h
#ifndef ADAPTER_H
#define ADAPTER_H
class Target{
public:
Target();
virtual ~Target();
virtual void Request();
};
class Adaptee{ //作为三方库
public:
Adaptee();
~Adaptee();
virtual void SpecificRequest();
};
class Adapter : public Target,private Adaptee{ //私有继承实现组合
public:
Adapter();
~Adapter();
void Request();
};
#endif // ADAPTER_H
//adapter.cpp
#include "adapter.h"
#include <iostream>
using std::cout;
using std::endl;
Target::Target(){
}
Target::~Target(){
}
void Target::Request(){
cout << "Target::Request" << endl;
}
Adaptee::Adaptee(){
}
Adaptee::~Adaptee(){
}
void Adaptee::SpecificRequest(){
cout << "Adaptee::SpecificRequest" << endl;
}
Adapter::Adapter(){
}
Adapter::~Adapter(){
}
void Adapter::Request(){
this->SpecificRequest();
}
//main.cpp
#include "adapter.h"
#include <iostream>
int main(int argc,char* argv[]){
Adaptee *ada = new Adaptee;
Target *aT = new Adapter();
aT->Request();
return 0;
}
/*******************************************************End******************************************************/
五、相关模式:
Bridge的接口与对象适配器类似,但是Bridge模式的出发点不同:Bridge是将接口部分和实现部分分离,从而对它们可以
较为容易也相对独立的加以改变;而Adapter则意味着改变一个已有对象的接口。
Decorator模式增强了其他对象的功能同时又不改变它的接口,因此Decorator对应用程序的透明性比适配器好。结果Decorator
支持递归组合,而纯粹使用适配器是不可能实现这一点的。
Proxy在不改变它的接口的条件下为另一个对象定义了一个代理。