设计模式实现思路介绍

设计模式是在软件工程中用于解决特定问题的典型解决方案。它们是在多年的软件开发实践中总结出来的,并且因其重用性、通用性和高效性而被广泛接受。设计模式通常被分为三种主要类型:创建型、结构型和行为型。


创建型设计模式

创建型设计模式专注于如何创建对象,以确保系统在创建对象时保持灵活性和可扩展性。

  1. 单例模式 (Singleton)

    • 思路:确保类只有一个实例,并提供一个全局访问点。
    • 实现:隐藏构造函数,使用静态方法返回唯一实例。
  2. 工厂方法模式 (Factory Method)

    • 思路:定义一个用于创建对象的接口,让子类决定实例化哪个类。
    • 实现:创建一个抽象方法,由子类实现具体对象的创建。
  3. 抽象工厂模式 (Abstract Factory)

    • 思路:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
    • 实现:定义一个接口用于创建相关的对象家族,具体工厂类实现这个接口。
  4. 建造者模式 (Builder)

    • 思路:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    • 实现:定义一个Builder接口,用于逐步构建复杂对象的各个部分。
  5. 原型模式 (Prototype)

    • 思路:使用已创建的对象作为原型,通过复制这个原型来创建新的对象。
    • 实现:实现克隆(复制)方法,返回对象的一个副本。

结构型设计模式

结构型设计模式处理对象的组合,通常用于实现更大的结构,同时简化结构或提高结构的灵活性。

  1. 适配器模式 (Adapter)

    • 思路:将一个类的接口转换成客户期望的另一个接口。
    • 实现:通过包装一个已存在的类,提供不同的接口。
  2. 桥接模式 (Bridge)

    • 思路:将抽象部分与实现部分分离,使它们可以独立变化。
    • 实现:定义一个抽象类持有一个对实现类的引用,并通过这个引用来调用实现具体行为。
  3. 组合模式 (Composite)

    • 思路:将对象组合成树形结构以表示部分-整体的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
    • 实现:定义一个包含子部件的组合类,和表示叶节点的类,它们实现相同的接口。
  4. 装饰器模式 (Decorator)

    • 思路:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
    • 实现:定义装饰类,它包装主类,并在保持主类接口不变的情况下,提供额外的功能。
  5. 外观模式 (Facade)

    • 思路:提供一个统一的接口,用来访问子系统中的一群接口,从而使得子系统更容易使用。
    • 实现:定义一个高层接口,它使得子系统更易于使用。
  6. 享元模式 (Flyweight)

    • 思路:运用共享技术有效地支持大量细粒度的对象。这样可以减少对象的数量,从而减少内存占用和提高性能。
    • 实现:创建一个享元工厂,用于管理共享对象的创建和缓存。确保相同的对象不会被重复创建。
  7. 代理模式 (Proxy)

    • 思路:提供一个替代品或占位符来控制对原对象的访问。代理可以控制对原对象的访问,并允许在将请求传递给原始对象之前或之后进行额外的操作。
    • 实现:定义一个代理类,与原始对象实现相同的接口,并在内部持有原始对象的引用。代理类可以在转发调用前后执行额外的逻辑。

行为型设计模式

行为型设计模式关注对象之间的责任分配。它们处理对象之间的通信,并在对象之间建立清晰的消息传递路径。

  1. 责任链模式 (Chain of Responsibility)

    • 思路:创建对象链,每个对象依次有机会处理请求。如果当前对象无法处理,则它会将请求传递给链上的下一个对象。
    • 实现:定义一个处理请求的接口,并在每个处理类中持有下一个处理对象的引用。请求沿着链传递,直到被处理。
  2. 命令模式 (Command)

    • 思路:将请求封装成对象,从而让你使用不同的请求、队列或日志请求来参数化其他对象。命令模式也支持可撤销的操作。
    • 实现:定义一个命令接口,具体命令实现该接口。调用者持有命令对象,并在适当的时刻执行命令。
  3. 解释器模式 (Interpreter)

    • 思路:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
    • 实现:创建抽象表达式类,具体表达式类实现此接口来解释目标语言。
  4. 迭代器模式 (Iterator)

    • 思路:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
    • 实现:定义迭代器接口,并实现具体迭代器,用于对聚合对象进行遍历。
  5. 中介者模式 (Mediator)

    • 思路:定义一个封装一组对象如何交互的对象。通过使对象明确地不相互引用,并将它们的交互委托给中介者对象,来减少多个对象之间的依赖关系。
    • 实现:创建中介者对象,它通常持有各个对象的引用,并协调它们之间的交互。
  6. 备忘录模式 (Memento)

    • 思路:在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便在将来可以将对象恢复到这个状态。
    • 实现:创建备忘录对象来存储主要对象的状态,并通过一个管理者来管理备忘录对象。
  7. 观察者模式 (Observer)

    • 思路:定义对象间的一种一对多的依赖关系,以便当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
    • 实现:实现一个主题接口,包含注册、注销和通知观察者的方法。观察者实现一个观察者接口,包含更新方法。当主题状态改变时,通过调用观察者的更新方法来通知所有注册的观察者。
  8. 状态模式 (State)

    • 思路:允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。
    • 实现:定义状态接口,并为每个具体状态实现该接口。上下文对象根据内部状态的变化切换状态对象,从而改变其行为。
  9. 策略模式 (Strategy)

    • 思路:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。
    • 实现:定义一个策略接口,具体策略类实现这个接口。上下文类持有一个策略对象,客户端可以设置使用哪个策略。
  10. 模板方法模式 (Template Method)

    • 思路:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
    • 实现:定义一个抽象类,其中包含一个模板方法和一系列抽象方法或钩子方法。子类实现这些方法,模板方法则定义了算法的步骤。
  11. 访问者模式 (Visitor)

    • 思路:表示一个作用于某对象结构中的各元素的操作。访问者模式使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    • 实现:定义一个访问者接口,具体访问者实现这个接口。元素类接受一个访问者对象,并通过调用访问者的访问方法来执行操作。

行为型设计模式通常涉及到算法和对象间的职责分配。这些模式不仅考虑对象本身,还考虑它们之间的交互,以及如何封装并隐藏这些交互的复杂性。


上下文对象模式

这个模式通常是指在程序的不同部分传递包含状态信息的对象。这个上下文对象封装了与请求相关的数据,以避免在方法调用中传递大量参数,或者是为了保持状态以跨多个方法调用。它是一种通过对象来共享数据的方式,使得你可以在程序的不同部分访问和修改这些数据。

在一些框架和库中,上下文对象模式被广泛使用,例如在web开发框架中,请求和响应对象就是上下文对象的实例,它们封装了HTTP请求和响应的所有数据。

与上下文对象模式组合使用的设计模式

上下文对象模式可以与多种设计模式组合使用,具体取决于你的设计需求,例如:

  1. 策略模式(Strategy Pattern): 上下文对象可以保存一个引用到策略对象,并在运行时根据需要切换策略。

  2. 状态模式(State Pattern): 上下文对象可以保存状态,并在其状态改变时改变其行为。

  3. 命令模式(Command Pattern): 上下文对象可以作为命令的一部分,封装所有必要的信息以执行命令。

  4. 观察者模式(Observer Pattern): 上下文对象可以通知一系列观察者对象关于其状态的变化。

  5. 单例模式(Singleton Pattern): 上下文对象本身可能被实现为单例,尤其是在应用全局状态时。

上下文管理器模式

另一个相关的概念是“上下文管理器”模式,这个模式在Python中非常常见,尤其是使用with语句来管理资源的情况。上下文管理器模式确保资源的分配和释放过程是干净的,即使在发生异常时也能保证资源的正确释放。

上下文管理器的例子:

# 使用上下文管理器管理文件资源
with open('file.txt', 'w') as file:
    file.write('Hello, World!')
# 文件在这个块结束时自动关闭

上下文管理器通常和工厂模式(Factory Pattern)结合使用,工厂负责创建对象,而上下文管理器负责管理对象的生命周期。在Python中,上下文管理器模式是一种特殊的应用方式,它使用with语句来简化资源管理。

综上所述,上下文设计模式指的是一种在程序中传递状态信息的模式,它可以与多种设计模式组合使用,具体取决于你的设计和需求。设计模式不是可以直接复制粘贴到你的代码中的解决方案,而是用于解决特定上下文中的常见问题的模板。在实际应用中,根据具体情况调整和组合这些模式是非常常见的。

学习资源

  • Java版设计模式
  • Go版设计模式

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

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

相关文章

Vine: 一种全新定义 Vue 函数式组件的解决方案

7月6日的 vue confg 大会上 ShenQingchuan 大佬介绍了他的 Vue Vine 项目, 一种全新定义 Vue 函数式组件的解决方案。 和 React 的函数式组件有异曲同工之妙,写起来直接起飞了。 让我们来快速体验一下 vine, 看看到底给我们带来了哪些惊喜吧…

AI周报(6.30-7.6)

AI应用-AI控制F16战机与人类飞行员狗斗 2024年美国国防部领导下的国防部高级研究计划局(DARPA)宣布,世界上首次人工智能(AI)驾驶的战斗机与人类驾驶的战斗机之间的空战,于去年秋季在加利福尼亚州爱德华兹空…

基于CentOS Stream 9平台搭建RabbitMQ3.13.4以及开机自启

1. erlang与RabbitMQ对应版本参考:https://www.rabbitmq.com/which-erlang.html 2. 安装erlang 官网:https://www.erlang.org/downloads GitHub: https://github.com/rabbitmq/erlang-rpm/releases 2.1 安装依赖: yum -y install gcc glib…

【LeetCode】螺旋矩阵

目录 一、题目二、解法完整代码 一、题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2&…

zdppy + vue3 + antd 实现一个表格编辑行,批量删除功能

编辑单元格和多选的功能 首先是编辑单元格的功能,点击编辑按钮,可以直接在表格中队内容进行编辑,点击保存以后能够同步到数据库。 其次是多选的功能,点击每行前面的多选框按钮,我们可以选中多行。 完整后端代码&am…

axios和Mybatis

除了get和post方法还有其他的方法: 发送 PUT 请求 发送 PUT 请求通常用于更新服务器上的资源。 const updateData {title: foo updated,body: bar updated,userId: 1 };axios.put(https://jsonplaceholder.typicode.com/posts/1, updateData).then(function (res…

Camera Raw:编辑 - 配置文件

Camera Raw “编辑”模块中的配置文件 Profile面板为照片编辑提供了一个坚实的基础,能够显著改善照片的初始外观,使编辑过程更加高效和灵活。 使用配置文件,可以控制如何呈现照片中的颜色和色调。配置文件旨在作为照片编辑的起点和基础。 ◆ …

数列结构(3.9)——队列应用

树的层次遍历 树的层次遍历,也称为树的广度优先遍历,是一种按照树的层次顺序,从上到下、从左到右遍历树中所有节点的算法。在二叉树中,这种遍历方式通常使用队列来实现。下面是层次遍历的基本步骤: 创建一个空队列&a…

qemu模拟orangepi

前言 由于qemu目前只支持orange pipc单板,也就是H3型号,故我们就拿这个型号做测试 环境搭建 linux主机环境 我这里采用win10 WSL,且环境用的是openeuler的,在选择服务器类型可以按照自己喜好选择,也就是包安装方式…

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进…

SUSAN

1995年英国牛津大学的S.M.Smith提出了一种新的图像边缘检测算法SUSAN算法,不同于以前经典边缘检测算法,SUSAN算法基于灰度相似性比较,采用圆形模板,对图像进行灰度差统计,无需计算方向导数,而且具备积分特性,它简单而且有效,适用于图像中边缘和角点的检测,可以去除图像…

【Unity】简单举例UI合批,优化draw call

1. UGUI-Editor 首先引入UGUI-Editor插件 链接: https://pan.baidu.com/s/1PpxStvgRCDi9xjUr6j6nCQ?pwdm5ju 提取码: m5ju 或者直接去Github搜索UGUI-Editor 2. 没有UI时 3. 放几个UI看看效果 4. 选中Canvas,右键优化Batch 发现减少了3个,这是因为&…

玉石风能否接棒黏土风?一探AI绘画新风尚

在数字艺术的浪潮中,AI绘画平台以其独特的创造力和便捷性,正在逐步改变我们对艺术的传统认知。从黏土风的温暖质感到琉璃玉石的细腻光泽,每一次风格的转变都引领着新的潮流。今天,我们将聚焦玉石风,探讨它是否能成为下一个流行的艺术滤镜,并提供一种在线体验的方式,让你…

昇思25天学习打卡营第13天 | ShuffleNet图像分类

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作:Pointw…

Spring AOP实现操作日志记录示例

1. 准备工作 项目环境:jdk8springboot2.6.13mysql8 1.1 MySQL表 /*Navicat Premium Data TransferSource Server : localhostSource Server Type : MySQLSource Server Version : 50730Source Host : 127.0.0.1:3306Source Schema …

通过IDEA生成webapp及web.xml配置文件

1、选择File->Project Structure 2、选择Modules-> + -> Web 有的springboot工程选择是war工程,这个web可能已经存在了。 如果不存在,就手动创建,创建后,需要修改pom.xml中的配置 <packaging>war</packaging> 3、创建webapp根目录 这步重点就是创建…

ARM架构以及程序运行解析

文章目录 1. ARM架构 2. ARM处理器程序运行的过程 3. 示例 3. 基于ARM架构的STM32单片机 1. 运行模式 2. 寄存器组 3. STM32的基本结构 4. STM32的运行模式 4. 寄存器组详解 1. 未备份寄存器 2. 备份寄存器 3. 程序计数器 4. 程序状态寄存器 5. CPSR和SPSR寄存器…

运维Tips | Ubuntu 24.04 安装配置 xrdp 远程桌面服务

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 Desktop 安装配置 xrdp 远程桌面服务 描述&#xff1a;Xrdp是一个微软远程桌面协议&#xff08;RDP&#xff09;的开源实现&#xff0c;它允许我们通过图形界面控制远程系统。这里使…

Banana Pi BPI-M5 Pro 低调 SBC 采用 Rockchip RK3576 八核 Cortex-A72/A53 AIoT SoC

Banana Pi BPI-M5 Pro&#xff0c;也称为 Armsom Sige5&#xff0c;是一款面向 AIoT 市场的低调单板计算机 (SBC)&#xff0c;由 Rockchip RK3576 八核 Cortex-A72/A53 SoC 驱动&#xff0c;提供Rockchip RK3588和RK3399 SoC 之间的中档产品。 该主板默认配备 16GB LPDDR4X 和…

学习笔记——动态路由——OSPF(特殊区域)

十、OSPF特殊区域 1、技术背景 早期路由器靠CPU计算转发&#xff0c;由于硬件技术限制问题&#xff0c;因此资源不是特别充足&#xff0c;因此是要节省资源使用&#xff0c;规划是非常必要的。 OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不…