23种设计模式具体实现方法

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、设计模式
    • 1、代理模式
    • 2、适配器模式
    • 2.1 总结
  • 3、工厂模式
  • 三、
    • 3.1
  • 总结

前言

前期疑问:
本文目标:


一、背景

最近

二、设计模式

1、代理模式

参考的这篇文章,代理模式(Proxy)

同时这篇文章还引用了另一篇文章,这篇文章使用了租客租房和中介的例子。设计模式之代理模式

2、适配器模式

这次狙击适配器模式

看了这篇文章,感觉讲的还算容易理解

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

文中描述了适配器的一个常规用法:

举一个常用的场景:
有一个设备管理类,可以动态增加和删除设备,并且还可以控制设备打开或者关闭,这个类实现之后,不用管设备具体类型,后期有新的奇奇怪怪的设备都可以兼容而不需要修改这个设备管理类的代码。

/**
 * @brief 设备控制统一接口
 */
class DeviceControl {
 public:
  DeviceControl() {}
  virtual ~DeviceControl() {}

 public:
  virtual void TurnOn() = 0;	// 统一的设备打开接口
  virtual void TurnOff() = 0;   // 统一的设备关闭接口
};

现在有一个电风扇设备,其接口假如是厂家提供的SDK,我们自己没法修改

/**
 * @brief 风扇设备控制接口
 */
class Fan {
 public:
  Fan() {}
  ~Fan(){};

 public:
  void Open() { std::cout << "open fan" << std::endl; };
  void Close() { std::cout << "close fan" << std::endl; };
};

还有一个电视机设备,其接口假如是厂家提供的SDK,我们自己没法修改

/**
 * @brief 电视机设备控制接口
 */
class TV {
 public:
  TV() {}
  ~TV(){};

 public:
  void Switch(bool value) {
    if (value == true)
      std::cout << "open tv" << std::endl;
    else
      std::cout << "close tv" << std::endl;
  };
};

现在要通过设备控制统一接口去控制上面的风扇和电视机,就需要实现两个适配器
风扇适配器:

/**
 * @brief 风扇适配器
 */
class FanAdapter : public DeviceControl {
 public:
  FanAdapter() : fan_(std::make_shared<Fan>()) {}
  virtual ~FanAdapter() override {}

 public:
  void TurnOn() override { fan_->Open(); };		// 风扇适配器中实际调用了风扇厂家提供的接口
  void TurnOff() override { fan_->Close(); };   // 风扇适配器中实际调用了风扇厂家提供的接口

 private:
  std::shared_ptr<Fan> fan_;
};

电视机适配器:

/**
 * @brief 电视机适配器
 */
class TVAdapter : public DeviceControl {
 public:
  TVAdapter() : tv_(std::make_shared<TV>()) {}
  virtual ~TVAdapter() override {}

 public:
  void TurnOn() override { tv_->Switch(true); };    // 电视机适配器中实际调用了电视机厂家提供的接口
  void TurnOff() override { tv_->Switch(false); };  // 电视机适配器中实际调用了电视机厂家提供的接口

 private:
  std::shared_ptr<TV> tv_;
};

客户端测试程序:

// 客户端测试程序
int main() {
  std::vector<std::shared_ptr<DeviceControl>> devices;	// 设备列表
  devices.emplace_back(std::make_shared<FanAdapter>()); // 添加设备
  devices.emplace_back(std::make_shared<TVAdapter>());  // 添加设备

  std::cout << "open all devices" << std::endl;
  for (const auto& v : devices) {
    v->TurnOn();
  }

  std::cout << "close all devices" << std::endl;
  for (const auto& v : devices) {
    v->TurnOff();
  }

  return 0;
}

运行结果

open all devices
open fan
open tv
close all devices
close fan
close tv

在上面这个例子中,设备控制统一接口中,有设备打开和关闭两个统一接口,而风扇和电视机也有其打开和关闭的接口,不过他们的接口并不统一,电视机的打开和关闭甚至使用了同一个接口,通过传入不同参数来区分是打开还是关闭,而通过给每个设备实现一个适配器,这样就可以将他们的接口统一起来,如果后面还要控制更多的其他设备,只需要给每个设备都实现一个适配器即可,无需修改已有的代码,这也符合开闭原则。

2.1 总结

适配器模式的优点主要包括:
(1)提高类的透明性和复用性: 适配器模式可以让类在现有的基础上进行复用,而不需要做出任何改变,这有助于避免大规模改写现有代码。
(2)解耦目标类和适配器类: 通过使用适配器模式,目标类和适配器类可以实现解耦,从而提高程序的扩展性。这符合开闭原则,即对扩展开放,对修改关闭。
(3)更好的扩展性: 在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
(4)灵活性好: 适配器并没有影响原有功能,如果不想使用,可以直接删除。

然而,适配器模式也存在一些缺点:
(1)增加系统复杂性: 适配器编写过程需要全面考虑,可能会增加系统的复杂性。
(2)降低代码可读性: 过多地使用适配器可能会使系统代码变得凌乱,增加代码阅读难度,降低代码可读性。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,如果系统中有太多这种情况,可能会使系统难以理解和维护。

3、工厂模式

参考文章:C++设计模式——工厂模式 :简单工厂、工厂方法、抽象工厂

三、

3.1


总结

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/897069.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[自动化测试:Selenium]:环境部署和Webdriver的使用

文章目录 修改安装源打开Python Packages。点击梅花按钮。在弹出的对话框中&#xff0c;填入Name&#xff08;随便填&#xff09;&#xff0c;Repository URL&#xff0c;选择下列的源&#xff0c;一般先选择清华源按OK确认。配置完成 安装seleniumFile→Settings→Project&…

为你的网站增加点灵性:随系统变色

&#x1f33b; 前言 网站切换主题色已经是非常常见的功能了&#xff0c;提供浅色和暗色两种色调可以满足用户的使用习惯&#xff0c;帮助这些用户获得更好的访问体验。但是只能用户手动切换主题。 那如果用户已经将系统切换到了深色模式&#xff0c;当他们打开我们网站的时候…

虚拟机网络设置为桥接模式

1、打开VMware Workstation Pro&#xff0c;点击“虚拟机—设置”&#xff0c;进入虚拟机设置页面 2、点击“网络适配器”&#xff0c;网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”&#xff0c;进入虚拟网络编辑器页面 4、选择桥接模式&#xff0c;并选择要桥接到的…

有趣的css - 跷跷板加载动画

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是使用 css 模拟一个跷跷板效果的加载动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…

YOLO目标检测

文章目录 一、含义二、与传统检测对比1.one-stage的优缺点2.two-stage的优缺点 三、MAP指标1.基本概念2.计算方法3.指标意义 一、含义 YOLO&#xff08;You Only Look Once&#xff09;是一种基于深度学习的目标检测算法&#xff0c;由Joseph Redmon等人于2016年提出。它的核心…

基于STM32的多功能MP3播放器

基于STM32的多功能MP3播放器 基于STM32的多功能MP3播放器一、项目背景与意义二、系统设计与实现2.1 硬件设计2.2 软件设计2.3 系统调试 三、功能实现与展望四、结论五、附录 基于STM32的多功能MP3播放器 在数字化时代&#xff0c;多功能播放器已成为我们生活中不可或缺的一部分…

Aurora 4.6.2 | 第三方谷歌商店,无需谷歌框架

Aurora Store是谷歌Play Store的一个非官方FOSS客户端&#xff0c;通常称为‘极光商店’&#xff0c;设计优雅。Aurora Store不仅可以下载、更新和搜索Play Store等应用程序&#xff0c;还为用户提供了新功能。应用提供范围广泛的游戏和应用程序&#xff0c;包括音乐流媒体、购…

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装 前言LiveCharts.Wpf介绍LiveCharts.Wpf的安装总结 前言 根据项目需求&#xff0c;我单独留了一个界面用于进行数据分析。数据分析的内容考虑是采用图表的形式将SQLite数据库中存储的数据进行绘制成图&#xff0c;以便数据分析。…

【ARM】ARM架构参考手册_Part B 内存和系统架构(5)

目录 5.1关于缓存和写缓冲区 5.2 Cache 组织 5.2.1 集联性&#xff08;Set-associativity&#xff09; 5.2.2 缓存大小 5.3 缓存类型 5.3.1 统一缓存或分离缓存 5.3.2 写通过&#xff08;Write-through&#xff09;或写回&#xff08;Write-back&#xff09;缓存 5.3.3…

09_实现reactive之代理 Set 和 Map

目录 创建代理建立响应式联系避免污染原始数据处理 forEachfor...ofvalues 与 keys 方法 Set 和 Map 都有特定的属性和方法来操作自身&#xff0c;因此需要单独处理。 创建代理 我们来看一段案例代码&#xff0c;体验一下和它们的独特之处&#xff0c;如下&#xff1a; const…

柯桥俄语学习,旅游俄语中的支付和交际常用语句

支付用语 --Здравствуйте, счёт, пожалуйста. --Как вы будете платить? --Вы принимаете карты? --Да, пожалуйста, покажите QR - код. --Нам нужно ещё одно б…

云原生技术:nacos进化到servicemash

面试的时候跟面试官吹嘘说&#xff0c;现在主流的微服务架构&#xff0c;都已经用得熟熟的了&#xff0c;自己技术很不错。进了公司却被分到了API资产管理平台&#xff0c;要做一个类似于网关的东西。经过调研才发现&#xff0c;自己用的微服务架构已经过时了&#xff0c;什么&…

基于yolov10的驾驶员抽烟打电话安全带检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv10的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统。该系统利用YOLOv10算法的高效性和准确性&#xff0c;实现对驾驶员行为的实时检测与识别。 YOLOv10是一种最新的实时物体检测模型&#xff0c;其通过深度学习技术&#xff0c;如卷…

FastCFS高性能分布式文件系统集群搭建

FastCFS – 可以跑数据库的高性能通用分布式文件系统 简介 FastCFS 是一款强一致性、高性能、高可用、支持百亿级海量文件的通用分布式文件系统&#xff0c;可以作为MySQL、PostgreSQL、Oracle等数据库&#xff0c;k8s、KVM、FTP、SMB和NFS等系统的后端存储。 FastCFS 主要特…

L0G1000 Linux 基础知识

1.创建虚拟机 构建完成后 按需启动&#xff0c;本次启动30分钟&#xff0c;启动完成后出现下图界面。 点击进入开发机&#xff0c;出现初始界面。 2. 配置SSH密钥进行SSH远程连接 2.1打开Windows PowerShell,利用 ssh-keygen -t rsa 输入命令后一路回车就可以了&#xff0c;…

WXML-模板语法-条件渲染及列表渲染

条件渲染&#xff1a; wx&#xff1a;if: 结合block使用wx:if&#xff1a; hidden&#xff1a; wx:if和hidden对比&#xff1a; 列表渲染&#xff1a; wx&#xff1a;for&#xff1a; 1、在.js文件中创建一个数组&#xff1a; 2、创建一个view使用wx&#xff1a;for组件&…

【机器学习】并行计算(parallel computation)Part2

Asynchronous Parallel Gradient Descent Using Parameter Server 用Parameter Server实现异步并行梯度下降 Parameter Server这种编程模型可以实现异步并行梯度下降&#xff0c;架构采用的是Client-Server&#xff0c;通信方式是Message-passing&#xff0c;同步方式是异步的…

windows scp 免密码文件传输

windows scp 免密码文件传输 scp 是基于ssh加密服务的一种文件传输方式&#xff0c;是常见的linux主机间文件传输方式&#xff0c;在windows中也是支持的。 配置目标&#xff1a; 两台windows主机间通过scp命令行传输文件梳理概念 客户端&#xff1a; 通过命令行实现文件传输…

Mycat2安装配置

安装配置 安装 目前Mycat2下载地址已经不可访问&#xff0c;安装包可从参考资料[1]获取 下载后解压zip文件&#xff0c;将jar放在lib目录下 编辑配置文件 编辑conf文件夹下的prototypeDs.datasource.json 更改数据库相关信息 启动 windows环境下启动Mycat 以管理员身份运行…

[论文阅读]Deep Depth Completion of a Single RGB-D Image

摘要 我们的工作目标是完成RGB-D图像的深度通道。商用级深度摄像头通常无法捕捉光滑、明亮、透明和远处表面的深度信息。为了解决这个问题&#xff0c;我们训练了一个深度网络&#xff0c;该网络以RGB图像作为输入&#xff0c;并预测稠密的表面法线和遮挡边界。然后&#xff0…