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

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

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

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

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

相关推荐
周努力.3 小时前
设计模式之中介者模式
设计模式·中介者模式
yangyang_z18 小时前
【C++设计模式之Template Method Pattern】
设计模式
源远流长jerry20 小时前
常用设计模式
设计模式
z263730561120 小时前
六大设计模式--OCP(开闭原则):构建可扩展软件的基石
设计模式·开闭原则
01空间1 天前
设计模式简述(十八)享元模式
设计模式·享元模式
秋名RG1 天前
深入理解设计模式之原型模式(Prototype Pattern)
设计模式·原型模式
Li小李同学Li2 天前
设计模式【cpp实现版本】
单例模式·设计模式
周努力.2 天前
设计模式之状态模式
设计模式·状态模式
268572592 天前
Java 23种设计模式 - 行为型模式11种
java·开发语言·设计模式
摘星编程2 天前
并发设计模式实战系列(19):监视器(Monitor)
设计模式·并发编程