设计模式--适配器Adapter模式(结构性)

适配器(Adapter)模式使用背景

日常生活经常用到各种各样的转换模块,比如:USB转HDMI,USB转串口,电源适配等等。在实际软件设计中也常常遇到类似情形,比如:已经实现类库的代码功能满足新的要求但接口不完全平匹配,不能直接使用,此时我们可以实现一个wrapper 类转换一下,转换成新需要的接口即可,从而避免了重复造车轮。这样软件可以通过适配层实现了完美复用,该方法也被称为适配器(Adapter)模式。

适配器(Adapter)模式主要应用于希望复用一些现存的类,但是接口又与新的复用环境要求不一致的情况。该模式表面看起来有点“多余”,适配层实现的功能与现有的类相同,实际上,由于软件开发维护处于不断维护更新过程中,极大可能因为不同人员、不同产品导致功能类似而接口不同的情况,因此使用适配器算是“无奈之举”。

适配器(Adapter)模式UML图

设计模式--适配器Adapter模式(结构性)_第1张图片

适配器(Adapter)模式代码示例

class Adaptee
{
public:
    Adaptee(){}
    virtual ~Adaptee(){}

public:
    void SpecificRequest()
    {
        //do whatever
    }
};

class Target    //abstract interface class
{
public:
    Target(){}
    virtual ~Target(){}

public:
    virtual void Request() = 0;
};

class Adapter: public Target
{
public:
    Adapter()
    {
        m_pAdaptee = new Adaptee();
    }
    ~Adapter()
    {
        if(m_pAdaptee != NULL)
        {
            delete m_pAdaptee;
            m_pAdaptee = NULL;
        }
    }

private:
    Adaptee* m_pAdaptee;

public:
    void Request()
    {
        if(m_pAdaptee!= NULL)
            m_pAdaptee->SpecificRequest();
    }
};

//usage example:
Target* pTarget = new Adapter();
pTarget->Request();

delete pTarget;
pTarget = NULL;

说明: 示例的Target 抽象类起到了抽象与实现分离的原则, 但在实际使用中,该类也可以是不存在的,直接使用Adapter 类封装即可达到复用的目的。设计模式作为一种指导,需要结合实际情况演变,切莫生搬硬套,为了设计而设计。

你可能感兴趣的:(软件设计)