(C++设计模式) ------Adapter模式-- 结构型模式
设计模式的学习是一个循序渐进的过程,每一个设计师都是在套用这几种设计模式来实现自己的软件构架,很多都是融合会贯通的,一个设计模式中不仅仅是用到一种,所以要灵活运用这些设计模式。理解了设计模式对设计和代码的阅读都有很大的好处!!
今天我们学习结构性模式Adapter模式.
Adapter模式就是把一个类的接口变换成客户端所期待的另一种接口,从而使因接口不匹配而无法在一起工作的两个类能够在一起工作(Gang of four)。
进一步的解释就是:适配器模式建议定义一个包装类,包装有不兼容接口的对象。这个包装类指的就是适配器(Adapter),它包装的对象就是适配者(Adaptee)。适配器提供客户类需要的接口,适配器接口的实现是把客户类的请求转化为对适配者的相应接口的调用。换句话说:当客户类调用适配器的方法时,在适配器类的内部调用适配者类的方法,这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于借口不兼容而不能交互的类可以一起工作(work together)。
■ 分类:
①对象适配器
对象适配器:包含一个适配器者的引用(reference)或者对象指针,与类适配器相同,对象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。
一般都是适配者都是作为适配器的一个私有的成员变量。
○ 抽象类:就是含有纯虚函数的类,不可被实例化的类。
○ 具体类:没有任何抽象操作即:没有纯虚函数的类(否则,它必为抽象的),但是抽象类可以有具体操作。
②类适配器
类适配器:是通过继承类适配者类(Adaptee Class)实现的,另外类适配器实现客户类所需要的接口。当客户对象调用适配器类方法的时候,适配器内部调用它所继承的适配者的方法。
一般适配者都是public继承target的接口,私有的继承适配者的接口。
接口继承:通过继承,子类获取到父类的接口。
实现继承:通过继承,子类获取父类的实现。
在C++中:public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。)
使用场景:使用场景
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
例子采用博客:http://www.cnblogs.com/jiese/p/3166396.html
Adapter.h
#ifndef _ADAPTER_H_ #define _ADAPTER_H_ //目标接口类,客户需要的接口 class Target { public: Target(); virtual ~Target(); virtual void Request();//定义标准接口 }; //需要适配的类 class Adaptee { public: Adaptee(); ~Adaptee(); void SpecificRequest(); }; //类模式,适配器类,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果 class Adapter:public Target,private Adaptee { public: Adapter(); ~Adapter(); virtual void Request();//实现Target定义的Request接口 }; //对象模式,适配器类,继承Target类,采用组合的方式实现Adaptee的复用 class Adapter1:public Target { public: Adapter1(Adaptee* adaptee); Adapter1(); ~Adapter1(); virtual void Request();//实现Target定义的Request接口 private: Adaptee* _adaptee; }; #endifadpter.cpp
#include "Adapter.h" #include using namespace std; 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::~Adapter() { } void Adapter::Request() { cout << "Adapter::Request()" << endl; this->SpecificRequest(); cout << "----------------------------" < _adaptee = _adaptee; } Adapter1::~Adapter1() { } void Adapter1::Request() { cout << "Adapter1::Request()" << endl; this->_adaptee->SpecificRequest(); cout << "----------------------------" <<endl; }main.cpp#include "Adapter.h" int main() { //类模式Adapter Target* pTarget = new Adapter(); pTarget->Request(); //对象模式Adapter1 Adaptee* ade = new Adaptee(); Target* pTarget1= new Adapter1(ade); pTarget1->Request(); //对象模式Adapter2 Target* pTarget2 = new Adapter1(); pTarget2->Request(); return 0; }