Adapter 模式解决的问题:
第三方的库提供的接口与我们在应用程序中已经设计好了的接口不一致。这些接口不兼容的类不能在一起工作
Adapter 模式提供了方法将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口。
Adapter 模式的类模式
Adapter_Class.h
#pragma once
class Target_Class
{
public:
Target_Class();
~Target_Class();
virtual void Request();
};
class Adaptee_Class//受改造的
{
public:
Adaptee_Class();
~Adaptee_Class();
void SpecificRequest();
};
//通过 private 继承Adaptee 获得实现继承的效果,而通过 public 继承 Target 获得接口继承的效果
class Adapter_Class :public Target_Class, private Adaptee_Class
{
public:
Adapter_Class();
~Adapter_Class();
void Request();
};
Adapter_Class.cpp
#include "Adapter_Class.h"
#include <iostream>
using namespace std;
Adapter_Class::Adapter_Class()
{
}
Adapter_Class::~Adapter_Class()
{
}
void Adapter_Class::Request()
{
this->SpecificRequest();
}
Target_Class::Target_Class()
{
}
Target_Class::~Target_Class()
{
}
void Target_Class::Request()
{
cout << "Target::Request" << std::endl;
}
Adaptee_Class::Adaptee_Class()
{
}
Adaptee_Class::~Adaptee_Class()
{
}
void Adaptee_Class::SpecificRequest()
{
cout << "Adaptee::SpecificRequest" << std::endl;
}
Adapter 模式的对象模式
Adapter_Object.h
#pragma once
class Target_Object
{
public:
Target_Object();
~Target_Object();
virtual void Request();
};
class Adaptee_Object
{
public:
Adaptee_Object();
~Adaptee_Object();
void SpecificRequest();
};
class Adapter_Object:public Target_Object
{
public:
Adapter_Object(Adaptee_Object *ade);
~Adapter_Object();
void Request();
private:
Adaptee_Object* _ade;
};
Adapter_Object.cpp
#include "Adapter_Object.h"
#include <iostream>
using namespace std;
Adapter_Object::Adapter_Object(Adaptee_Object * ade)
{
this->_ade = ade;
}
Adapter_Object::~Adapter_Object()
{
}
void Adapter_Object::Request()
{
_ade->SpecificRequest();
}
Target_Object::Target_Object()
{
}
Target_Object::~Target_Object()
{
}
void Target_Object::Request()
{
cout << "Target::Request" << std::endl;
}
Adaptee_Object::Adaptee_Object()
{
}
Adaptee_Object::~Adaptee_Object()
{
}
void Adaptee_Object::SpecificRequest()
{
cout << "Adaptee::SpecificRequest" << std::endl;
}
main.cpp
#include <iostream>
using namespace std;
#include "Adapter_Class.h"
#include "Adapter_Object.h"
int main(int argc, char* argv[])
{
//Adapter 模式的类模式 通过继承的方式
Target_Class* adt_class = new Adapter_Class();
adt_class->Request();
//Adapter 模式的对象模式 通过组合的方式
Adaptee_Object* ade_object = new Adaptee_Object();
Target_Object* adt_object = new Adapter_Object(ade_object);
adt_object->Request();
system("pause");
return 0;
}
Adaptee::SpecificRequest
Adaptee::SpecificRequest
请按任意键继续. . .
可以看到
通过Adapter模式可以方便的通过target类调用adaptee类的接口,而不用修改adaptee的接口。