适配器模式

2018-08-01-18-31-58

以前写过一个例子, 通过 Adapter 适配 Target 和 Adaptee.

一般 Target 是需求,Adaptee 是需要兼容 Target 的旧部分.

再具体点:

大型的项目里,某个地方就是调用 Target 的 sendData,这个地方不能改;但其功能 Adaptee 的 sendCommandData 可以满足,只是调用不满足;于是用 Target 的派生类作为 Adapter 来包装 Adaptee,封装 sendCommandData 的调用.

#include <iostream>

using namespace std;
class Target {
    public:
        virtual int sendData(const char* data) = 0;
        virtual ~Target(){}
};

class Adaptee {
    public:
        int sendCommandData(const char* cmd, const char* data){
            cout << "cmd = " << cmd << endl;
            cout << "data = " << data << endl;
            return 0;
        }
};

class Adapter : public Target {
    public:
        Adapter(Adaptee* t):tee(t) {}
        //适配Adaptee里的SendCommandData
        int sendData(const char* data)  {
            return tee->sendCommandData("default",data);
        }
    private:
        Adaptee* tee;
};

int main(int argc, char* argv[])
{
    //Adapter封装Adaptee,具有和Target一致的接口,但是功能确不同了.
    //间接使用了Adaptee的不同的方法
    Target* target =  new Adapter(new Adaptee());

    //该target对象在初始阶段,就要考虑到可能适配新的接口.
    target->sendData("Adapter mode is running");
    return 0 ;
}

还有一些扩展的模式,如双向适配器模式,Target 和 Adaptee 之间互相适应.