小小及

适配器模式

使用场景:将一个类的接口转换成客户希望的另外一个接口,从而使原本由于接口不兼容而不能一起工作的类可以一起工作。适配器充当一个中介的角色,链接”他人”与”自己”。

例子:世界各国插座标准都不尽相同,甚至同一国家的不同地区也可能不一样。例如,中国一般使用两脚扁型,而俄罗斯使用的是双脚圆形。那么,如果去俄罗斯旅游,就会出现一个问题:我们带去的充电器为两脚扁型,而他们提供的插座为双脚圆形,如何给手机充电呢?总不能为了旅客而随意更改墙上的插座吧,而且俄罗斯人一直都这么使用,并且用的很好。俗话说入乡随俗,那么只能自己想办法解决了。

1. 对象适配器:

俄罗斯提供的插座:(他人的)

// target.h
#ifndef TARGET_H
#define TARGET_H

#include <iostream>

// 俄罗斯提供的插座
class IRussiaSocket
{
public:
    // 使用双脚圆形充电(暂不实现)
    virtual void Charge() = 0;
};

#endif // TARGET_H

再来看看我们自带的充电器:(自己的)

// adaptee.h
#ifndef ADAPTEE_H
#define ADAPTEE_H

#include <iostream>

using namespace std;

// 自带的充电器 - 两脚扁型
class OwnCharger
{
public:
    void ChargeWithFeetFlat() {
        cout << "OwnCharger::ChargeWithFeetFlat" << endl;
    }
};

#endif // ADAPTEE_H
 

创建适配器:电源适配器(中介)

// adapter.h
#ifndef ADAPTER_H
#define ADAPTER_H

#include "target.h"
#include "adaptee.h"

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif

// 电源适配器
class PowerAdapter : public IRussiaSocket
{
public:
    PowerAdapter() : m_pCharger(new OwnCharger()){}
    ~PowerAdapter() {
        SAFE_DELETE(m_pCharger);
    }
    void Charge() {
        //  使用自带的充电器(两脚扁型)充电
        m_pCharger->ChargeWithFeetFlat();
    }

private:
    OwnCharger *m_pCharger;  // 持有需要被适配的接口对象 - 自带的充电器
};

#endif // ADAPTER_H

使用方法:

// main.cpp
#include "adapter.h"

int main()
{
    // 创建适配器
    IRussiaSocket *pAdapter = new PowerAdapter();

    // 充电
    pAdapter->Charge();

    SAFE_DELETE(pAdapter);

    getchar();

    return 0;
}

2.类适配器

Target 和 Adaptee 保持不变,只需要将 Adapter 变为多继承的方式即可:

#ifndef ADAPTER_H
#define ADAPTER_H

#include "target.h"
#include "adaptee.h"

// 电源适配器
class PowerAdapter : public IRussiaSocket, OwnCharger
{
public:
    PowerAdapter() {}
    void Charge() {
        // 使用自带的充电器(两脚扁型)充电
        ChargeWithFeetFlat();
    }
}

 除此之外,其他用法和“对象适配器”一致。

 

参考:https://blog.csdn.net/liang19890820/article/details/66973296

 

 

posted on 2018-08-04 11:00  小小及  阅读(147)  评论(0编辑  收藏  举报

导航