适配器模式是软件开发中常用的模式之一,比如我们之前写的类提供的接口(老的接口)在新的环境下已经不合适了,那么我们怎么改变才能使老的接口适配现在新的接口呢?之前说过设计模式中常用的手法就是组合和继承,这在适配器模式中得到了很好的体现。首先,我们要从新的接口继承一个类,这个类就是适配器类(为什么要从新接口继承?那是为了遵循新接口提供的接口规范),那这个适配器类要怎么去适配老的接口呢?很显然的办法是用组合,即在适配类中提供一个老接口的字段。
适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口,从而使原本由于接口不兼容而不能一起工作的类可以一起工作。
用现实中的列子来类比,比如我们常见的电源适配器,就是将原来的接口(不合适的电压),转换成现在可用的接口(合适的电压)。
UML结构图如下:
下面我用伪码来表述上面的例子。
//首先我们来看新的接口,即目标接口
class ITarget
{
public:
virtual void process()=0;//处理问题的新方法
}
//这个是老的接口,即源接口
class ISource
{
public:
virtual void step1()=0;
virtual void step2()=0;
}
//噔噔噔....适配器类登场
class Adapter : public ITarget
{
protected:
ISource * m_pSource;//老接口的指针
public:
Adapter(ISource * pSource)//构造函数,外界需要传一个老接口的指针进来
{
m_pSource = pSource;
}
void process()//遵循新接口
{
//利用老接口的特性,做相应的处理,使其满足现在的需求
pSource->step1();
......
pSource->step2();
......
}
}
//现在可以开始用电源适配器了
//老的电压
class OldVoltage : public ISource
{
public:
virtual void step1() {}
virtual void step2() {}
};
int main()
{
//老的电压遵循老的接口
ISource *pOld = new OldVoltage();
//用适配器来转换
ITarget *pTarget = new Adapter(pOld);
pTarget->process();//好了,老的电压可以用了
}
现在返回那张UML图我们再来看:
结合到我们的例子和适配器模式的定义,其中稳定的部分就是目标接口类和源接口类,而变化的是适配器类,因为如果有新的目标接口的话适配器类就做出相应的改变,以适应新的接口。我们通过继承的方式来得到新接口的接口规范(就是要用它的虚函数),然后通过组合的方式(就是包含一个老接口的指针作为适配器类的成员)得到老接口的某些使用方法从而达到适应新接口的目的。
最后,如果理解的有偏差,还请指出!