当前位置: 首页 > article >正文

C++ 设计模式:适配器模式(Adapter Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 门面模式
链接:C++ 设计模式 - 代理模式
链接:C++ 设计模式 - 中介者

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口,从而使原本由于接口不兼容而无法一起工作的类可以协同工作。

1.问题分析

在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。为了让这些类能够协同工作,我们需要一种方法来“适配”它们的接口。

2.实现步骤

  1. 定义目标接口(Target Interface):这是客户期望使用的接口。
  2. 定义现有接口(Adaptee Interface):这是需要适配的现有接口。
  3. 创建适配器类(Adapter Class):适配器类实现目标接口,并在内部调用现有接口的方法。

3.代码示例

3.1.定义旧接口(Adaptee)

class OldInterface {
 public:
  void oldRequest() { std::cout << "Old request" << std::endl; }
};

3.2.定义新接口(Target)

class NewInterface {
 public:
  virtual ~NewInterface() = default;
  virtual void newRequest() = 0;
};

3.3.定义对象适配器(Adapter)

class ObjectAdapter : public NewInterface {
 public:
  ObjectAdapter(std::unique_ptr<OldInterface> adaptee) : adaptee_(std::move(adaptee)) {}

  void newRequest() override { adaptee_->oldRequest(); }

 private:
  std::unique_ptr<OldInterface> adaptee_;
};

3.4.客户端代码

int main() {
  std::unique_ptr<OldInterface> oldInterface = std::make_unique<OldInterface>();
  std::unique_ptr<NewInterface> adapter = std::make_unique<ObjectAdapter>(std::move(oldInterface));
  adapter->newRequest();  // 输出 "Old request"
  return 0;
}

4.总结

适配器模式的核心思想是通过引入一个适配器类,将现有接口转换为目标接口。适配器类实现目标接口,并在内部持有现有接口的实例,通过调用现有接口的方法来实现目标接口的方法。

适配器模式有两种主要形式:

  1. 类适配器:通过多重继承实现适配器模式,适配器类继承目标接口和现有接口。这种方式在C++中不常用,因为多重继承可能带来复杂性。
  2. 对象适配器:通过组合实现适配器模式,适配器类持有现有接口的实例。这种方式更为常见,因为它更灵活且符合单一职责原则。

http://www.kler.cn/a/463170.html

相关文章:

  • 《Vue进阶教程》第三十四课:toRefs的使用
  • 【数据结构】树链刨分
  • MySQL 05 章——排序与分页
  • MinGW 和 MinGW-w64 的介绍与配置
  • 华为OD机试真题---服务器广播
  • 算法-判断4的次幂
  • 在Unity中用Ab包加载资源(简单好抄)
  • 家政预约小程序05活动管理
  • Centos文件已删除空间未释放
  • leetcode 3280. 将日期转换为二进制表示 简单
  • Spring Boot 3 文件下载、多文件下载以及大文件分片下载、文件流处理、批量操作 和 分片技术
  • Java工程师实现视频文件上传minio文件系统存储及网页实现分批加载视频播放
  • 12.30-1-5学习周报
  • 【时时三省】(C语言基础)动态内存函数realloc
  • Node.js 常用命令全攻略
  • VSCode 插件开发实战(十三):如何添加个性化欢迎信息
  • Whiteboard-of-Thought——让大语言模型在白板上写下它们的推理过程,可以大大提高模型在视觉推理能力
  • Github - 如何提交一个带有“verified”标识的commit
  • 【漫话机器学习系列】031.数据增强(Dateset augmentation)
  • 安装、快速入门
  • npm 切换镜像源
  • MySQL5.7主从同步配置
  • mysql查询报错java.sql.SQLException: Illegal mix of collations for operation ‘UNION‘
  • 【智行安全】基于Synaptics SL1680的AI疲劳驾驶检测方案
  • 原生js封装ajax请求以及css实现提示效果和禁止点击效果
  • Android笔试面试题AI答之Android基础(9)