动机(Motivation)
- 由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足。
- 如何应对这些”迁移的变化“?
模式定义
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
类图
//目标接口(新接口)
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);
}
};
即这个Adapter是一个老接口(继承ITargert),拥有一个新接口,调用老接口的函数时(process),实际使用新接口的能力完成这些功能。
如当我们引用一个第三库,一般不会与我们的现有系统直接适配,我们会在其上面封装一层接口,适配现有的系统,这就是适配器。
要点总结
- 在遗留代码复用、类库迁移等方面有用