设计模式之行为型模式

本文已收录于专栏
《设计模式》

目录

  • 概念说明
    • 大话设计模式
    • 行为型模式
  • 各模式详解
    • 第一组
      • 观察者模式(Observer Pattern)
      • 模板方法模式(Template Method Pattern)
      • 命令模式(Command Pattern)
      • 状态模式(State Pattern)
      • 职责链模式(Chain of Responsibility Pattern)
    • 第一组总结分类
    • 第二组
      • 解释器模式(Interpreter Pattern)
      • 中介者模式(Mediator Pattern)
      • 访问者模式(Visitor Pattern)
      • 策略模式(Strategy Pattern)
      • 备忘录模式(Memento Pattern)
      • 迭代器模式(Iterator Pattern)
    • 第二组总结和分类
  • 其他模式
  • 总结提升

概念说明

大话设计模式

  大话设计模式主要分为三部分,第一部分是创建型模式,第二部分是结构型模式,第三部分是行为型模式。至于为什么要分为这三部分,我的理解是创建型是用于创建对象的而结构型是发生在类与类之间的关系是比较宏观的,比如说组合或者交互。行为型是一个微观的关系主要体现在对象与对象之间和方法与方法之间。接下来说一说行为型模式。

行为型模式

  行为型模式用于描述程序在运行时复杂的流程控制,即描述对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,是一种微观关系的体现。行为型模式包括:第一组(观察者模式、模板方法、命令模式、状态模式、职责链模式)第二组(解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式)

各模式详解

第一组

观察者模式(Observer Pattern)

在这里插入图片描述

  • 好处:定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听一个主题对象的状态变化。解耦了主题和观察者之间的依赖关系,提高了代码的灵活性和可扩展性。
  • 使用场景:当一个对象的状态变化需要通知其他对象,并且不希望对象之间紧密耦合时,可以使用观察者模式。例如,新闻订阅、事件通知等场景。

模板方法模式(Template Method Pattern)

在这里插入图片描述

  • 好处:定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。提供了一种固定的算法结构,同时允许子类灵活地实现自己的具体步骤。
  • 使用场景:当有一个算法的整体结构是固定的,但其中某些步骤的具体实现可能有所变化时,可以使用模板方法模式。例如,游戏中的角色行为、数据库访问操作等场景。

命令模式(Command Pattern)

在这里插入图片描述

  • 好处:将请求封装成一个对象,使得可以将请求的发送者和接收者解耦。提供了一种灵活的方式来组织和执行命令,支持撤销、重做等操作。
  • 使用场景:当需要将请求封装成对象,并且支持撤销、重做等操作时,可以使用命令模式。例如,遥控器控制电器、菜单项的点击操作等场景。

状态模式(State Pattern)

在这里插入图片描述

  • 好处:将对象的状态抽象成独立的状态类,使得对象在不同状态下可以有不同的行为。将状态的切换逻辑封装到状态类中,使得状态转换逻辑更加清晰和可维护。
  • 使用场景:当一个对象的行为取决于它的状态,并且需要在运行时动态地改变对象的状态时,可以使用状态模式。例如,订单的状态转换、游戏中角色的状态转换等场景。

职责链模式(Chain of Responsibility Pattern)

在这里插入图片描述

  • 好处:将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。提供了一种灵活的方式来组织和执行责任链,可以动态地改变责任链的结构。
  • 使用场景:当需要将请求的发送者和接收者解耦,并且希望多个对象都有机会处理请求时,可以使用责任链模式。例如,请求的处理链、日志记录的链式处理等场景。

第一组总结分类

在这里插入图片描述
  分类只从每个模式的类图中是否体现了聚合关系,也可以说从他们之间关系的强弱来进行区分,无聚合关系比较弱,有聚合关系就比较强。

第二组

解释器模式(Interpreter Pattern)

在这里插入图片描述

  • 好处:将一个复杂的语言或规则表达式分解为一系列简单的解释器,使得解释器的添加和修改变得灵活和可扩展。提供了一种简洁的方式来解释和处理特定的语法规则。
  • 使用场景:当需要解析和处理一种特定的语言或规则,且需要灵活地添加和修改解释器时,可以使用解释器模式。例如,编译器的语法分析、正则表达式的解析等场景。

中介者模式(Mediator Pattern)

在这里插入图片描述

  • 好处:共享细粒度的对象,减少内存使用,提高性能。通过共享,可以在有限的内存中支持大量的对象。
  • 使用场景:当需要创建大量相似的对象,并且这些对象可以共享部分状态时,可以使用享元模式。例如,字符缓存池、线程池等。

访问者模式(Visitor Pattern)

在这里插入图片描述

  • 好处:共享细粒度的对象,减少内存使用,提高性能。通过共享,可以在有限的内存中支持大量的对象。
  • 使用场景:当需要创建大量相似的对象,并且这些对象可以共享部分状态时,可以使用享元模式。例如,字符缓存池、线程池等。

策略模式(Strategy Pattern)

在这里插入图片描述

  • 好处:定义了一系列算法,并将每个算法封装到独立的策略类中,使得它们可以互相替换。提供了一种灵活的方式来选择和使用不同的算法,而不需要修改客户端代码。
  • 使用场景:当需要在运行时选择不同的算法,或者需要根据不同的条件使用不同的算法时,可以使用策略模式。例如,支付方式的选择、排序算法的选择等场景。

备忘录模式(Memento Pattern)

在这里插入图片描述

  • 好处:备忘录模式可以在不破坏封装性的前提下,捕获和保存一个对象的内部状态,并提供一种恢复到之前状态的机制。它可以有效地实现对象的撤销、恢复和历史记录功能。
  • 使用场景:当需要实现对象的撤销、恢复和历史记录功能时,可以使用备忘录模式。例如,文本编辑器的撤销和恢复功能、游戏中的进度保存和恢复功能等场景。

迭代器模式(Iterator Pattern)

在这里插入图片描述

  • 好处:提供了一种统一的方式来访问聚合对象中的元素,而不需要暴露聚合对象的内部表示。简化了聚合对象的遍历和操作。
  • 使用场景:当需要遍历和操作聚合对象中的元素,且不希望暴露聚合对象的内部表示时,可以使用迭代器模式。例如,集合类中的迭代操作、文件系统中的目录遍历等场景。

第二组总结和分类

在这里插入图片描述
  一:代表只选择一个对象。比如说策略模式,可以有很多的策略但是最后选择的只有一个对象。

  多:代表需要便利多个对象。比如说中介者模式中的例子,具体中介者可以知道很多的具体的同时,但是同事和同事之间是互相不了解的。对于中介者和同事之见就是一对多的关系。

其他模式

创建型模式:https://blog.csdn.net/weixin_45490198/article/details/131432094
结构型模式:https://blog.csdn.net/weixin_45490198/article/details/131432715

总结提升

  这些行为型设计模式都提供了一种灵活、可复用和可扩展的方式来组织和管理对象之间的交互和通信。正确地选择和使用适合的设计模式可以提高代码的可维护性、可读性和可测试性,并帮助我们构建更好的软件系统。


🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能指针+拷贝构造+vector容器+多态引起的bug

今天在调试一段代码的时候,VC编译提示: error C2280: “T485CommCtrlPara::T485CommCtrlPara(const T485CommCtrlPara &)”: 尝试引用已删除的函数 函数执行部分如下: 看意思是这个pComm485Pro已经消亡了,后续push_back到ve…

【Linux】MHA高可用配置及故障切换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MHA高可用配置及故障切换 MHA高可用配置及故障切换MHA概述MHA 的组成MHA 的特点 搭建 MySQL MHA1.Master、Slave1、Slave2 节点上安装 mysql5.72.修改…

Web项目思路

登录注册 账号密码登录,注册时生成唯一id。 找回密码 通过验证邮箱来修改现在的密码。 主页 显示最受欢迎的博主,点赞次数最多的博客,根据用户收藏夹中的偏好推荐博客等 遍历数据库,找到粉丝数最多的博主和点赞次数最多的博客…

配置本地的application-dev.yml读取nacos上面的配置

我想配置本地的application-dev.yml读取nacos上面的配置,我应该在配置文件里怎么写?并且在nacos里怎么建立 在本地的application-dev.yml文件中,您可以使用Spring Cloud Nacos来读取Nacos上的配置。以下是在配置文件和Nacos中设置的步骤&…

火爆全网,Jenkins创建容器-Python自动化测试环境搭建(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 下载 Jenkins 镜像…

【Spring】Spring框架介绍,功能模块,容器知识和有关Spring的生态圈的详细讲解

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

Java垃圾搜集算法和垃圾回收算法

垃圾回收主要针对的是JVM的堆内存,分为新生代和老年代。 按照以前的叫法,还有一个永久代,它在方法区里保存了class信息、静态变量、常量池等。 从jdk-1.8开始,方法区的实现发生了一些变化,取消了永久代的概念&#xff…

RabbitMQ管理界面介绍

1.管理界面概览 connections: 无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况 channels: 通道,建立连接后,会形成通道,消息的投递获取依…

【网络编程】自定义协议+Json序列化与反序列化

文章目录 一、序列化与反序列化概念二、自定义协议设计网络计算机2.1 服务端2.1.1 服务端业务处理流程2.1.2 TCP的发送与接收缓冲区2.1.3 保证读取完整报文2.1.4 自定义协议——序列化与反序列化2.1.4.1 请求2.4.1.2 响应 2.1.5 计算流程2.1.6 在有效载荷前添加长度报头2.1.7 发…

威胁建模之绘制数据流图

0x00 前言 1、什么是威胁建模: 以结构化的方式思考、记录并讨论系统存在的安全威胁,并针对这些威胁制定相应的消减措施。 2、为什么要威胁建模: (1)在设计阶段开展威胁建模,一方面可以更全面的发现系统存…

处理glibc堆栈缓冲区溢出漏洞(CVE-2018-11236)

GNU C Library(又名glibc,libc6)是一种按照LGPL许可协议发布的开源免费的C语言编译程序。 GNU C库(aka glibc或libc6)中的stdlib/canonicalize.c处理非常长的路径名参数到realpath函数时,可能会遇到32位体系…

Electron中启动node服务

记一次遇到的问题,我们知道Electron 中主进程是在node环境中,所以打算在node环境中再启动一个node服务。但是直接使用exec命令启动就会卡主。对应的代码如下 // 启动Node server const startServer async () > {try {console.log(开始启动node serv…