C++设计模式之适配器模式(接口隔离)(Adapter)
1、序论
在组件构建的过程中,某些接口之间的依赖常常会带来很多的问题、甚至根本无法去实现。采用添加一层间接的稳定接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。
在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放进新的环境中去应用,但是新环境要求的接口是这些现存对象所不满足的。
如何去应对这种“迁移的变化”?如何既能利用现有对象的良好的实现,同时又能够满足新的应用环境所要求的接口?
模式的定义:
将一个类的接口转化为客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作得那些类可以一起工作
2、适配器模式的结构类图
3、代码实现(伪代码)
//目标接口(新接口)
class ITarget{
public:
virtual void process()=0;
};
//遗留接口(老接口)
class IAdaptee{
public:
virtual void foo(int data)=0;
virtual int bar()=0;
};
//遗留类型
class OldClass: public IAdaptee{
//....
};
//对象适配器
class Adapter: public ITarget{ //继承
protected:
IAdaptee* pAdaptee;//组合
public:
Adapter(IAdaptee* pAdaptee){
this->pAdaptee=pAdaptee;
}
virtual void process(){
int data=pAdaptee->bar();
pAdaptee->foo(data);
}
};
//类适配器
class Adapter: public ITarget,
protected OldClass{ //多继承
}
int main(){
IAdaptee* pAdaptee=new OldClass();
ITarget* pTarget=new Adapter(pAdaptee);
pTarget->process();
}
//我们常常使用的栈和队列其实就时双端队列适配的 结构如下:
class stack{
deqeue container;
};
class queue{
deqeue container;
};
4、总结
1> 适配器模式主要应用于“复用一些现存的类,但是接口又与复用环境要求的不一致的情况,在遗留代码复用、类库迁移等方面非常的有用。
2> 适配器模式的实现结构:对象适配器和类适配器。但类适配器采用多继承的实现方式,一般不推荐使用。对象适配器采用:对象组合的方式,更加的符合松耦合的精神。
3> 适配器模式可以实现的非常的灵活,不必拘泥固定的实现方式。
适配器和类适配器。但类适配器采用多继承的实现方式,一般不推荐使用。对象适配器采用:对象组合的方式,更加的符合松耦合的精神。