在实际软件系统设计和开发中,经常会遇到这样的问题。为了完成快速某项工作,有时会选择购买第三方库。
但是可能会带来这样的问题:我们的应用程序已设计好的接口和第三方提供的接口不一致。为了让这些接口不兼容的类可以在一起工作,适配器(Adapter)模式就可以大显身手了。 它可以将一个类(第三方库)的接口转化为客户希望的接口。
适配器模式可以分为两种:类模式的Adapter采用继承的方式继承Adaptee的接口,而对象模式的Adapter则采用组合的方式实现对adaptee的复用。
以电压转化为例:
类模式:
形如:
代码:
#include <iostream> using namespace std; class Target { public: virtual ~Target(){} public: virtual void use5v() { cout << "工作电压为5v" << endl; } }; class Adaptee { public: void use220V() { cout << "工作电压为220v" << endl; } }; // 适配器 class Adapter : public Target, private Adaptee { public: virtual void use5v() { cout << "适配220v" << endl; this->use220V(); } }; void test() { Target *target = new Adapter(); target->use5v(); delete target; } int main() { test(); cin.get(); return 0; }
通过private继承Adaptee获得实现继承的效果,而通过public继承Target实现接口继承的效果
对象模式:
代码:
#include <iostream> using namespace std; class Target { public: virtual ~Target(){} public: virtual void use5v() { cout << "工作电压为5v" << endl; } }; class Adaptee { public: void use220V() { cout << "工作电压为220v" << endl; } }; // 适配器 class Adapter : public Target { public: Adapter(Adaptee *t) :_adaptee(t){} virtual void use5v() { cout << "适配220v" << endl; _adaptee->use220V(); } private: Adaptee *_adaptee; }; void test() { Adaptee *adaptee = new Adaptee(); Target *target = new Adapter(adaptee); target->use5v(); delete adaptee; delete target; } int main() { test(); cin.get(); return 0; }