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 对象的引用。AdapterTarget 接口的 request() 方法映射到 AdapteedoSomething() 方法。
  • 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;
}

总结

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

相关推荐
以卿a25 分钟前
C++ 模板初阶
开发语言·c++
黑不溜秋的6 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
付聪12108 小时前
策略模式介绍和代码示例
设计模式
Dream it possible!8 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
柠石榴8 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
王老师青少年编程8 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛
ThereIsNoCode9 小时前
「软件设计模式」状态模式(State)
设计模式·状态模式
澄澈天空10 小时前
C++ MFC添加RichEditControl控件后,程序启动失败
c++·mfc
Lzc77411 小时前
C++初阶——简单实现vector
c++·简单实现vector
一个小白111 小时前
C++——list模拟实现
开发语言·c++