C++结构型设计模式之适配器模式概述

适配器模式的意图和动机

意图:适配器模式(Adapter Pattern)是一种结构型设计模式,其意图是将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。

动机:在软件开发过程中,我们经常会遇到需要使用一些已有的类库或组件,但这些类库或组件的接口与当前系统的接口不兼容。为了复用这些已有的组件,同时又不修改已有代码,适配器模式提供了一种灵活的解决方案。

适配器模式适用于解决的问题

  1. 接口不兼容:当需要使用一个已有类的功能,但其接口与客户端代码的接口不兼容时。
  2. 复用已有组件:在不修改已有类的情况下,复用其功能,并使其适应新的接口。
  3. 多接口适配:在需要将多个不同的接口适配成一个统一接口的场景中。

适配器模式的适用场合

  1. 已有类的接口与客户端不兼容:当需要使用一个已有类的功能,但其接口与客户端代码的接口不兼容时。
  2. 第三方库或组件的兼容性问题:当引入第三方库或组件时,其接口与现有系统的接口不兼容。
  3. 多接口适配:当需要将多个不同的接口适配成一个统一接口的场景中。

适配器模式的结构和参与角色

适配器模式涉及以下角色:

  1. Target(目标接口):客户端期望的接口。
  2. Adapter(适配器):实现了目标接口,同时持有对Adaptee的引用,并将客户端的请求适配到Adaptee的操作上。
  3. Adaptee(被适配者):已有的类或对象,其接口与目标接口不兼容。
  4. Client(客户端):与目标接口交互的对象。

UML 类图

以下是适配器模式的 UML 类图:

复制代码
+-------------------+           +-------------------+
|      Target       |           |      Adapter      |
|-------------------|           |-------------------|
| + request()       |<----------|>+ request()       |
+-------------------+           |-------------------|
                                  | - adaptee: Adaptee|
                                  |-------------------|
                                  | + request()       |
                                  |-------------------|
                                  | + doSomething()   |
                                  +-------------------+
                                        |
                                        |
                                        V
                                  +-------------------+
                                  |      Adaptee      |
                                  |-------------------|
                                  | + doSomething()   |
                                  +-------------------+

类图说明

  • Target:定义了客户端所期望的接口。
  • Adapter :实现了目标接口 Target,并包含一个 Adaptee 对象的引用。Adapter 将 Target 接口的 request() 方法映射到 Adaptee 的 doSomething() 方法。
  • Adaptee :已有的类或对象,其接口与目标接口不兼容。Adaptee 有一个 doSomething() 方法,客户端无法直接使用该方法。
  • Client :与 Target 接口交互的对象,通过 Adapter 间接调用 Adaptee 的功能。

示例代码

以下是一个简单的C++示例代码,展示了适配器模式的实现:

复制代码
#include <iostream>

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

// Adaptee 类
class Adaptee {
public:
    void doSomething() const {
        std::cout << "Adaptee: Doing something." << std::endl;
    }
};

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

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

    void request() const override {
        adaptee->doSomething();
    }
};

// 客户端代码
int main() {
    Adaptee* adaptee = new Adaptee();
    Target* adapter = new Adapter(adaptee);

    adapter->request(); // 调用适配器的方法

    delete adaptee;
    delete adapter;

    return 0;
}

总结

适配器模式通过引入一个适配器类,将不兼容的接口转换成客户端所期望的接口,从而解决了接口不兼容的问题。它适用于需要复用已有组件但接口不兼容的场景,通过适配器模式,可以避免修改已有代码,提高系统的灵活性和可扩展性。

相关推荐
David猪大卫3 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger3 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz6 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化6 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu7 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
cjz38998 小时前
规则树:把一百行if-else拆成一棵树
设计模式
ShineWinsu8 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖8 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
沫璃染墨9 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
Adellle10 小时前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式