适配器模式(Adapter Pattern)

定义

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另一个接口。这种模式通常用于解决接口不兼容的问题。适配器模式包括三个角色:目标接口(Target)、适配器(Adapter)和被适配者(Adaptee)。

示例

在 C++ 中,适配器模式可以通过类适配器和对象适配器两种方式来实现。下面分别介绍这两种方式,并提供相应的示例。

类适配器

在类适配器中,适配器类继承自目标接口类,并且包含一个被适配者类的实例。

cpp 复制代码
#include <iostream>

// 目标接口
class Target {
public:
    virtual void request() = 0;
};

// 被适配者类
class Adaptee {
public:
    void specificRequest() {
        std::cout << "Adaptee: specificRequest\n";
    }
};

// 适配器类
class Adapter : public Target, private Adaptee {
public:
    void request() override {
        specificRequest();
    }
};

// 客户端代码
int main() {
    Target* target = new Adapter();
    target->request();

    delete target;
    return 0;
}

在这个例子中,Target 是目标接口,Adaptee 是被适配者,而 Adapter 则通过继承 Target 并包含 Adaptee 的实例来实现适配。

对象适配器

在对象适配器中,适配器类持有一个被适配者类的实例,并实现目标接口。

cpp 复制代码
#include <iostream>

// 目标接口
class Target {
public:
    virtual void request() = 0;
};

// 被适配者类
class Adaptee {
public:
    void specificRequest() {
        std::cout << "Adaptee: specificRequest\n";
    }
};

// 适配器类
class Adapter : public Target {
private:
    Adaptee* adaptee;

public:
    Adapter(Adaptee* adaptee) : adaptee(adaptee) {}

    void request() override {
        adaptee->specificRequest();
    }
};

// 客户端代码
int main() {
    Adaptee* adaptee = new Adaptee();
    Target* target = new Adapter(adaptee);
    target->request();

    delete target;
    delete adaptee;
    return 0;
}

在对象适配器中,Adapter 持有一个 Adaptee 的实例,并实现了 Target 接口,从而将 Adaptee 的接口转换成了 Target 的接口。

这就是适配器模式在 C++ 中的示例。适配器模式可以很好地解决接口不兼容的问题,使得原本不兼容的类能够协同工作。

生活中的应用

在生活中,适配器模式的一个常见应用是电源适配器。考虑以下情况:你带着笔记本电脑去国外旅行,但是国外的电源插座与你笔记本电脑的电源插头不兼容。这时你需要一个电源适配器,将国外的电源插座转换成你笔记本电脑所需的插头类型,以便正确地充电。

让我们用 C++ 来模拟这个情景,实现一个简单的电源适配器示例:

cpp 复制代码
#include <iostream>
#include <string>

// 目标接口:笔记本电脑充电器接口
class LaptopCharger {
public:
    virtual void charge() = 0;
};

// 笔记本电脑
class Laptop {
public:
    void chargeWith(LaptopCharger* charger) {
        charger->charge();
    }
};

// 适配者:国外电源插座
class ForeignPowerSocket {
public:
    void providePower() {
        std::cout << "ForeignPowerSocket: Providing power.\n";
    }
};

// 适配器:电源适配器
class PowerAdapter : public LaptopCharger {
private:
    ForeignPowerSocket* socket;

public:
    PowerAdapter(ForeignPowerSocket* socket) : socket(socket) {}

    void charge() override {
        // 调用国外电源插座的方法来提供电源
        socket->providePower();
        std::cout << "PowerAdapter: Converting power to the laptop.\n";
    }
};

int main() {
    // 创建笔记本电脑
    Laptop laptop;

    // 创建国外电源插座
    ForeignPowerSocket socket;

    // 创建电源适配器
    PowerAdapter adapter(&socket);

    // 使用适配器给笔记本电脑充电
    laptop.chargeWith(&adapter);

    return 0;
}

在这个示例中,LaptopCharger 是目标接口,代表笔记本电脑的充电器接口。Laptop 类表示笔记本电脑,它有一个充电方法,接受一个实现了 LaptopCharger 接口的对象作为参数来充电。

ForeignPowerSocket 类表示国外的电源插座,它有一个提供电源的方法。PowerAdapter 类是适配器,它实现了 LaptopCharger 接口,并持有一个 ForeignPowerSocket 对象的引用。在 charge 方法中,它调用了 ForeignPowerSocket 的提供电源方法来提供电源,并输出一条消息表示正在将电源转换成笔记本电脑所需的形式。

main 函数中,我们创建了笔记本电脑对象、国外电源插座对象和电源适配器对象,并通过适配器给笔记本电脑充电。

这个示例展示了适配器模式在生活中的应用,即将一个电源接口转换成另一个电源接口,使得笔记本电脑能够在国外充

相关推荐
炸膛坦客8 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
旖-旎8 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
Henry Zhu1239 小时前
C++中的特殊成员函数与智能指针
c++
_wyt00111 小时前
多重背包问题详解
c++·背包dp
Ljwuhe12 小时前
C++——多态
开发语言·c++
越甲八千12 小时前
STL stack为何没有迭代器
c++
从零开始的代码生活_14 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸14 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地15 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
王维同学15 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全