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

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

设计模式

  • 适配器结构和组成
    • 结构和组成
    • 示例
      • 1.定义目标接口
      • 2.实现适配者
      • 3.实现适配器
      • 4.客户端代码
    • 解释

适配器结构和组成

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另一个接口。这种模式通常用于使原本由于接口不兼容而不能一起工作的类能够协同工作。

结构和组成

适配器模式涉及以下几个核心组件:
目标接口(Target Interface):客户端期望的接口,也是适配器要实现的接口。
适配器(Adapter):适配器是一个实现了目标接口的类,它持有一个对适配者对象的引用,并将客户端的请求转发给适配者。
适配者(Adaptee):需要被适配的现有类,它的接口与目标接口不兼容。

示例

假设有一个现有的英国插座(Adaptee),但我们需要一个能够在欧洲使用的插座(Target Interface)。我们可以使用适配器模式来实现一个适配器,将英国插座转换为欧洲插座。

1.定义目标接口

首先,我们定义一个欧洲插座的接口:

// Target Interface
class EuropeanSocketInterface {
public:virtual void power() = 0;virtual ~EuropeanSocketInterface() {}
};

2.实现适配者

接下来,我们有一个英国插座(适配者),它有不同的接口:`

// Adaptee (existing UK socket)
class BritishSocket {
public:void plugIn() {std::cout << "Plugged into British socket" << std::endl;}
};

3.实现适配器

现在,我们创建一个适配器,使得英国插座可以符合欧洲插座的接口要求:

// Adapter
class SocketAdapter : public EuropeanSocketInterface {
private:BritishSocket* adaptee;public:SocketAdapter(BritishSocket* adaptee) : adaptee(adaptee) {}void power() override {// Using adapter to call specific method of adapteeadaptee->plugIn();}
};

4.客户端代码

最后,我们可以使用适配器模式在客户端代码中测试适配器:

int main() {BritishSocket* britishSocket = new BritishSocket();EuropeanSocketInterface* adapter = new SocketAdapter(britishSocket);// Plug in using European standardadapter->power();delete britishSocket;delete adapter;return 0;
}

解释

目标接口 EuropeanSocketInterface 定义了在欧洲使用的插座接口,其中 power() 方法是适配器需要实现的方法。

适配者 BritishSocket 是现有的英国插座,它有自己的 plugIn() 方法,与目标接口不兼容。

适配器 SocketAdapter 继承自 EuropeanSocketInterface,持有一个 BritishSocket 的实例,将 power() 方法委托给 BritishSocket 的 plugIn() 方法,从而实现了对欧洲插座接口的适配。

客户端代码 创建了一个英国插座对象和适配器对象,然后使用适配器对象调用了EuropeanSocketInterface 的 power() 方法,实际上调用了 BritishSocket 的 plugIn() 方法。
适配器模式使得不兼容的接口可以一起工作,提高了代码的复用性和灵活性。

相关文章:

  • Ubuntu配置ssh+vnc(完整版)
  • 数据结构:为什么说链表是顺序表的升级版(c语言实现)
  • pgsql给单独数据库制定账号权限
  • Kotlin 中的内联函数
  • AI与音乐:共创未来乐章还是终结艺术的颂歌?
  • Docker容器导出导入
  • Python发送Email的性能怎么样?如何配置?
  • Unity定时(延迟)管理器实现
  • 数据结构-线性表的顺序表示
  • Webstorm vue项目@路径不能跳转到对应资源,提示Cannot find declaration to go to
  • Android记录19-朋友圈动态发布时间计算
  • 事件传播机制 与 责任链模式
  • Matlab 入门学习
  • .net core使用EPPlus设置Excel的页眉和页脚
  • G7易流赋能化工物流,实现安全、环保与效率的共赢
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • JS基础之数据类型、对象、原型、原型链、继承
  • MySQL主从复制读写分离及奇怪的问题
  • Node 版本管理
  • node入门
  • php ci框架整合银盛支付
  • Python爬虫--- 1.3 BS4库的解析器
  • Vue.js 移动端适配之 vw 解决方案
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 少走弯路,给Java 1~5 年程序员的建议
  • 设计模式(12)迭代器模式(讲解+应用)
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 再谈express与koa的对比
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • #07【面试问题整理】嵌入式软件工程师
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (12)Hive调优——count distinct去重优化
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (4)(4.6) Triducer
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (论文阅读40-45)图像描述1
  • (三)模仿学习-Action数据的模仿
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *上位机的定义
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core 项目指定SDK版本
  • .NET MVC 验证码
  • .NET Reactor简单使用教程
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net(C#)中String.Format如何使用
  • .NET4.0并行计算技术基础(1)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET技术成长路线架构图
  • .NET开发不可不知、不可不用的辅助类(一)
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节