长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 创建型模式

  • 结构型模式

    • 适配器模式(Adapter Pattern)
      • 概念
      • 思想
      • 角色
      • 优点
      • 缺点
      • 类图
      • 示例代码
    • 桥接模式(Bridge Pattern)
    • 组合模式(Composite Pattern)
    • 装饰器模式(Decorator Pattern)
    • 外观模式(Facade Pattern)
    • 享元模式(Flyweight Pattern)
    • 代理模式(Proxy Pattern)
  • 行为型模式

  • 设计模式
  • 结构型模式
DC Wang
2023-05-28
目录

适配器模式(Adapter Pattern)

# 适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构设计模式,用于将一个类的接口转换成客户端所期望的另一种接口。它允许不兼容的类能够合作共同工作。

# 概念

适配器模式允许通过引入一个适配器类,将一个类的接口转换成客户端所期望的另一种接口。这样,客户端就可以使用适配器类来调用目标类的方法,而不需要修改客户端代码。

# 思想

适配器模式通过将客户端代码和现有类进行解耦,使得现有类可以在不修改其代码的情况下与客户端协同工作。适配器类作为中间件,将客户端的请求转发给现有类,并将现有类的响应转换成客户端所期望的格式。

# 角色

  1. 目标接口(Target Interface):定义客户端所期望的接口。
  2. 适配器(Adapter):实现目标接口,并持有一个现有类的实例,在接口方法中将请求转发给现有类。
  3. 现有类(Adaptee):包含需要被适配的方法和功能。

# 优点

  • 解耦性:适配器模式将客户端和现有类解耦,使得它们可以独立进行修改和扩展。
  • 重用性:适配器模式可以重用现有类的功能,无需修改现有类的代码。
  • 扩展性:通过添加新的适配器类,可以方便地增加新的适配器,以适应不同的需求。

# 缺点

  • 增加了额外的类:适配器模式引入了适配器类,增加了代码的复杂性。
  • 运行时性能损耗:由于适配器的存在,调用过程中会增加一些额外的开销。

# 类图

@startuml
class Client {
    +request()
}

interface TargetInterface {
    +request()
}

class Adapter {
    -adaptee: Adaptee
    +request()
}

class Adaptee {
    +specificRequest()
}

Client --> TargetInterface
Adapter --> TargetInterface
Adapter --> Adaptee
@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 示例代码

下面是一个使用C++实现的适配器模式的示例代码:

#include <iostream>

// 目标接口
class TargetInterface {
public:
    virtual void request() = 0;
};

// 现有类
class Adaptee {
public:
    void specificRequest() {
        std::cout << "Adaptee's specificRequest() called." << std::endl;
    }
};

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

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

    void request() override {
        adaptee->specificRequest();
    }
};

// 客户端
class Client {
private:
    TargetInterface* target;

public:
    Client(TargetInterface* target) : target(target) {}

    void makeRequest() {
        target->request();
    }
};

int main() {
    Adaptee* adaptee = new Adaptee();
    Adapter* adapter = new Adapter(adaptee);
    Client client(adapter);
    client.makeRequest();

    delete adaptee;
    delete adapter;

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

运行结果:

Adaptee's specificRequest() called.
1

示例代码中,我们有一个现有类Adaptee,它包含一个名为specificRequest的方法。我们希望在客户端Client中调用TargetInterface接口的request方法来使用Adaptee的功能。

为了实现适配,我们创建了一个适配器类Adapter,它继承自TargetInterface接口,并持有一个Adaptee对象。在适配器的request方法中,我们将请求转发给Adaptee的specificRequest方法。

在main函数中,我们创建了一个Adaptee对象和一个适配器对象Adapter,并将适配器对象传递给客户端Client。然后,我们通过调用客户端的makeRequest方法来触发适配器的请求过程。最终,输出结果显示Adaptee's specificRequest() called.,表明适配器模式成功地将客户端的请求转发给了Adaptee的功能。

编辑 (opens new window)
#设计模式#结构型模式
上次更新: 2023/06/10, 08:05:09
原型模式(Prototype Pattern)
桥接模式(Bridge Pattern)

← 原型模式(Prototype Pattern) 桥接模式(Bridge Pattern)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式