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

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

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

  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 接口调用。
*/

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

相关推荐
那年星空9 小时前
Flutter 设计模式全面解析:抽象工厂
flutter·设计模式·架构
博风10 小时前
设计模式:10、外观模式
设计模式·外观模式
你好helloworld12 小时前
设计模式之观察者模式
观察者模式·设计模式
zzzhpzhpzzz16 小时前
设计模式——抽象工厂模式
设计模式·抽象工厂模式
阳光开朗_大男孩儿17 小时前
组合设计模式
c++·设计模式·组合模式·组合设计模式
编程、小哥哥18 小时前
设计模式之代理模式(模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景)
设计模式·mybatis·代理模式
白茶等风1213819 小时前
Unity 设计模式-状态模式(State Pattern)详解
设计模式·状态模式
好好学习++19 小时前
【HF设计模式】01-策略模式
java·c++·设计模式·策略模式
zzzhpzhpzzz20 小时前
设计模式——状态模式
设计模式·状态模式
oioihoii20 小时前
建造者模式
c++·设计模式·c#·建造者模式