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

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;elsestd::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.lryc.cn/news/464920.html

相关文章:

  • cisco网络安全技术第3章测试及考试
  • 数据结构练习题5(链表和栈)
  • 计算机网络408真题解析(湖科大教书匠)
  • uniapp+vue3+uview-plus修改默认样式
  • 数控机械制造工厂ERP适用范围有哪些
  • 华为配置 之 Console线路配置
  • 小米等手机彻底关闭快应用
  • 【每日一题】24.10.14 - 24.10.20
  • CMake与Qt4/Qt5的结合使用指南
  • TwinCAT3添加PLC轴,并建立PLC轴与NC轴的链接
  • Linux操作系统如何制作U盘启动盘
  • 如何防止SpringBoot中的jar反编译?解决相关报错及踩到的坑
  • Axios 基本使用
  • 前端大佬都在用的actionDelegationMiddleware究竟有多香?
  • 解决k8s集群中安装ks3.4.1开启日志失败问题
  • Qml-Item的Id生效范围
  • 【配色网站分享】
  • 【记录】Android|安卓平板 猫游戏(四款,peppy cat,含下载教程和链接)
  • 微前端架构及其解决方案对比
  • git add操作,文件数量太多卡咋办呢,
  • 搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
  • Spring Boot 核心理解-自动装配
  • go 中指针的执行效率比较
  • 单链表的经典算法OJ
  • 视频网站开发:Spring Boot框架的高效实现
  • 【前端】如何制作一个自己的网站(11)
  • 【Conda】提高 Conda 下载速度与兼容性的完美指南
  • 【Flutter】页面布局:层叠布局(Stack、Positioned)
  • SpringBoot实现的汽车票在线预订系统
  • 集合框架14:TreeSet概述、TreeSet使用、Comparator接口及举例