adapter,其实除了是一种软件设计模式,也是系统设计中经常碰到的思路。两个模块交互,有一个升级后接口变了,另一个还不想升级,这时候就需要一个适配模块,做个翻译的工作。总体思想比较简单。
C++实现有两种,一种是类适配。通过公共继承目标类,私有继承被适配的类的多重继承来实现。因为本人对多重继承没什么好感,所以没写相关demo。
另一种就是组合方式,适配器维护一个被适配的类的指针来实现。
因为比较简单,所以直接把代码放出来。其中适配器还提供了一种默认实现,很多时候感觉有个默认实现已经能满足需求了。
//adaptee
#ifndef __MY_ADAPTEE_H_ #define __MY_ADAPTEE_H_ #include <iostream> class Adaptee { public: Adaptee(){} ~Adaptee(){ std::cout<<"dtor of Adaptee called!"<<std::endl; } void SpecificRequest(){ std::cout<<"SpecificRequest is called!"<<std::endl; } }; #endif //__MY_ADAPTEE_H_
/** * @file my_adapter.h * @author itegel * @date 2014/03/19 16:20:38 * @brief * **/ #ifndef __MY_ADAPTER_H_ #define __MY_ADAPTER_H_ #include <iostream> #include "my_adaptee.h" class Target { public: explicit Target(){} virtual void Request() { return; }// task }; class Adapter : public Target { public: //default constructor, for simple use Adapter(){ adaptee_ = new Adaptee(); default_constructed_ = true; } Adapter(Adaptee * adaptee){ adaptee_ = adaptee; } //delete what we created ~Adapter(){ if (default_constructed_){ delete adaptee_; } } //do task void Request(){ adaptee_->SpecificRequest(); return; } private: Adaptee *adaptee_; bool default_constructed_; //flag for default constructor }; #endif //__MY_ADAPTER_H_//output
SpecificRequest is called! SpecificRequest is called! dtor of Adaptee called!
对于多重继承有个概念比较重要“用公共方式继承接口;用私有方式继承接口实现”
原文:http://blog.csdn.net/itegel84/article/details/21543267