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_
//adapter
/**
* @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!
对于多重继承有个概念比较重要“用公共方式继承接口;用私有方式继承接口实现”