大话设计模式之适配器模式

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。这种模式通常用于使原本由于接口不兼容而不能一起工作的类能够协同工作。

适配器模式涉及以下几个关键角色:

  1. 目标接口(Target):客户端期望使用的接口。适配器通过实现这个接口来使得被适配的类能够与客户端协同工作。

  2. 适配器(Adapter):它是适配器模式的核心组件,它实现了目标接口,并持有一个被适配的对象的引用。适配器通过调用被适配对象的方法来实现目标接口的方法。

  3. 被适配者(Adaptee):它是客户端不直接使用但需要被适配器适配的类。

适配器模式可以分为两种实现方式:

  • 类适配器模式:通过多重继承(在一些编程语言中支持多重继承的情况下)或者通过代理的方式实现适配器。在这种情况下,适配器类同时继承目标接口和被适配者类,并实现目标接口的方法,内部调用被适配者类的方法。

  • 对象适配器模式:通过组合的方式实现适配器。在这种情况下,适配器持有一个被适配者类的引用,并实现目标接口的方法,内部调用被适配者类的方法。

适配器模式的优点包括:

  • 提高了代码的复用性,可以将现有的类和接口组合在一起使用。

  • 使得客户端无需修改现有代码,就可以使用新的接口。

  • 可以解决不兼容接口之间的问题,使得原本不兼容的类可以协同工作。

但是,适配器模式也有一些缺点,例如:

  • 如果适配器类过多,可能会导致系统中存在大量的适配器类,增加了系统的复杂性。

  • 如果被适配者类的接口发生变化,可能需要修改适配器类的代码。

总的来说,适配器模式适用于需要在不改变现有代码的情况下与不兼容的接口进行交互的场景,它是一种非常有用的设计模式。

cpp 复制代码
#include <iostream>

// 被适配的类
class LegacyRectangle {
public:
    LegacyRectangle(int width, int height) : width_(width), height_(height) {}

    int calculateArea() const {
        return width_ * height_;
    }

private:
    int width_;
    int height_;
};

// 目标接口
class Rectangle {
public:
    virtual ~Rectangle() {}
    virtual int getArea() const = 0;
};

// 适配器类,继承自 Rectangle 接口,内部持有一个 LegacyRectangle 对象
class RectangleAdapter : public Rectangle {
public:
    RectangleAdapter(const LegacyRectangle& legacyRectangle) : legacyRectangle_(legacyRectangle) {}

    int getArea() const override {
        // 在适配器中调用被适配者的方法
        return legacyRectangle_.calculateArea();
    }

private:
    LegacyRectangle legacyRectangle_;
};

int main() {
    // 使用适配器来调用 LegacyRectangle 的方法,但是通过 Rectangle 接口
    LegacyRectangle legacyRect(5, 10);
    RectangleAdapter adapter(legacyRect);

    // 通过 Rectangle 接口调用
    std::cout << "Area: " << adapter.getArea() << std::endl;

    return 0;
}

/*
在这个示例中,LegacyRectangle 类是一个已经存在的类,它有一个 calculateArea() 方法用于计算矩形的面积。然后我们定义了一个新的接口 Rectangle,其中有一个 getArea() 方法用于获取矩形的面积。RectangleAdapter 类是适配器,它继承自 Rectangle 接口,内部持有一个 LegacyRectangle 对象,并在 getArea() 方法中调用 LegacyRectangle 的 calculateArea() 方法来实现 Rectangle 接口的方法。最后在 main() 函数中,我们通过适配器来使用 LegacyRectangle 的方法,但是通过 Rectangle 接口调用。
*/

觉得有帮助的话,打赏一下呗。。

相关推荐
阿无,34 分钟前
java23种设计模式之前言
设计模式
Asort1 小时前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机2 小时前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の4 小时前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom12 小时前
[C++] --- 常用设计模式
开发语言·c++·设计模式
@大迁世界15 小时前
Vue 设计模式 实战指南
前端·javascript·vue.js·设计模式·ecmascript
数据智能老司机19 小时前
数据工程设计模式——冷热数据存储
大数据·设计模式·架构
爱学习的小熊猫_20 小时前
设计模式之责任链模式
设计模式·责任链模式
闲不住的李先森20 小时前
乐观更新
前端·react.js·设计模式
数据智能老司机1 天前
数据工程设计模式——实时摄取与处理
大数据·设计模式·架构