C++设计模式之适配器模式

一、适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类所期望的接口,以便两个类能够协同工作。

适配器模式可以解决现有类接口与所需接口不匹配的问题,使得原本因接口不兼容而无法合作的类可以一起工作。

在C++中,适配器模式通常涉及以下几个角色:

  • 目标接口(Target Interface):定义了客户端代码期望的接口。
  • 适配者(Adaptee):存在的类或组件,其接口与目标接口不匹配。
  • 适配器(Adapter):实现了目标接口,并通过包装适配者的方式将其接口转换为目标接口。

主要应用在以下场景:

  • 新旧接口兼容软件版本升级,部分旧接口还在被使用。需要保留旧的接口,增加新接口,使两者兼容。
  • 第三方接口的适配在系统功能稳定的情况下,有第三方新的接口需求需要对接。
  • 统一多个类相同功能的接口,例如统一不同类型数据库的访问接口。

二、类适配器

以多继承方式实现。

  • Target: 客户端期望接口类
  • Adaptee: 实际需要的功能类
  • Adapter: 将接口类与功能类衔接的适配器类
  • Client: 客户端代码
cpp 复制代码
// 目标接口(新系统的接口)
class Target {
public:
    virtual ~Target() = default;
    virtual void Request() = 0;
};

// 被适配的类(老系统的接口)
class Adaptee {
public:
    void SpecificRequest() {
        // 一些特殊的请求
        cout << "Specific Request of Adaptee!" << endl;
    }
};

// 类适配器
class Adapter : public Target, private Adaptee {
public:
    void Request() override {
        // 将目标接口转化为特殊的请求
        SpecificRequest();
    }
};

int main() {
    Target* target = new Adapter;
    target->Request(); // 输出: Specific Request of Adaptee!

    delete target;
    return 0;
}

三、对象适配器

在适配器类中,包装适配者(Adaptee)接口。

  • Target: 客户端期望接口类
  • Adaptee: 实际需要的功能类
  • Adapter: 将接口类与功能类衔接的适配器类
  • Client: 客户端代码
cpp 复制代码
// 目标接口
class TargetInterface {
public:
    virtual void request() = 0;
};

// 适配者
class Adaptee {
public:
    void specificRequest() {
        // 执行适配者特定的操作
        // ...
    }
};

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

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

    void request() override {
        // 调用适配者的特定方法
        adaptee->specificRequest();
    }
};

int main() {
    // 创建适配者对象
    Adaptee* adaptee = new Adaptee();

    // 创建适配器对象,将适配者对象传入
    TargetInterface* adapter = new Adapter(adaptee);

    // 调用目标接口方法,实际上会执行适配者的特定方法
    adapter->request();

    delete adapter;
    delete adaptee;

    return 0;
}

四、总结

类适配器模式使用继承来适配接口;
对象适配器模式通过将适配者对象作为适配器类的成员变量来实现适配;

无论是类适配器模式还是对象适配器模式,都可以实现接口适配的效果,选择哪种方式取决于具体的需求和设计考虑。

参考

相关推荐
郝学胜-神的一滴2 小时前
设计模式依赖于多态特性
java·开发语言·c++·python·程序人生·设计模式·软件工程
帅次2 小时前
系统分析师:软件需求工程的软件需求概述、需求获取、需求分析
设计模式·重构·软件工程·团队开发·软件构建·需求分析·规格说明书
EXtreme353 小时前
【数据结构】算法艺术:如何用两个栈(LIFO)优雅地模拟队列(FIFO)?
c语言·数据结构·算法·设计模式·栈与队列·摊还分析·算法艺术
1024肥宅1 天前
JavaScript常用设计模式完整指南
前端·javascript·设计模式
特立独行的猫a1 天前
C++观察者模式设计及实现:玩转设计模式的发布-订阅机制
c++·观察者模式·设计模式
better_liang1 天前
每日Java面试场景题知识点之-单例模式
java·单例模式·设计模式·面试·企业级开发
sg_knight1 天前
什么是设计模式?为什么 Python 也需要设计模式
开发语言·python·设计模式
koping_wu1 天前
【设计模式】设计模式原则、单例模式、工厂模式、模板模式、策略模式
单例模式·设计模式·策略模式
__万波__1 天前
二十三种设计模式(九)--组合模式
java·设计模式·组合模式
__万波__1 天前
二十三种设计模式(十)--外观模式
java·设计模式·外观模式