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

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

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、设计模式
    • 1、代理模式
    • 2、适配器模式
    • 2.1 总结
  • 三、
    • 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.1


总结

未完待续


http://www.kler.cn/news/357868.html

相关文章:

  • 【Java 定时任务】小顶堆与时间轮算法介绍 + 多线程代码练习
  • springsecurity使用
  • STL-vector+题目
  • Python爬虫:获取数据的入门详解
  • qt creator 开发环境的安装
  • 【论文笔记】X-Former: Unifying Contrastive and Reconstruction Learning for MLLMs
  • 如何通过CDN优化网站服务器访问速度?
  • AWD学习
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-11
  • R语言医学数据分析实践-R编程环境的搭建
  • 【在Linux世界中追寻伟大的One Piece】应用层自定义协议|序列化
  • linux笔记(yum本地源仓库搭建)
  • arp欺骗及其实验
  • 简单介绍$listeners
  • Linux服务器安装SRAToolkit教程
  • 3D Gaussian Splatting前向渲染代码解读
  • 鸿蒙网络编程系列28-服务端证书锁定防范中间人攻击示例
  • JavaWeb环境下的Spring Boot在线考试系统开发
  • LiveKit 在Kylin Server V10 下离线安装和配置
  • DataWhale10月动手实践——Bot应用开发task02学习笔记