第四篇 行为型设计模式 - 灵活定义对象间交互

第四篇:行为型设计模式 - 灵活定义对象间交互

行为型设计模式关注对象之间的交互和职责分配,旨在定义对象间的高效、灵活的通信机制。以下是十一种常见行为型设计模式的详解及其应用场景。

1. 策略模式详解及其应用场景

详解:
策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用该算法的客户。

在策略模式中,通常包含以下角色:

  • Strategy(策略)接口:声明所有支持的算法的公共操作。
  • Concrete Strategy(具体策略)类:实现 Strategy 接口,提供具体的算法实现。
  • Context(上下文)类:持有一个 Strategy 对象引用,使用这个策略来执行相关操作。

应用场景:
策略模式适用于以下场景:

  • 当一个系统需要在多种算法中进行选择时,如排序算法、数据加密等。
  • 当如果更换或增加新的算法,不希望修改客户端代码时。

例如,在电商系统中,可以根据不同的促销策略创建多个具体策略类,上下文根据用户选择的策略应用相应的优惠算法。

2. 模板方法模式详解及其应用场景

详解:
模板方法模式在一个抽象类中定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。它使得子类可以在不改变结构的情况下重写部分算法。

在模板方法模式中,通常包含以下角色:

  • Abstract Class(抽象类):定义了一个或多个操作的固定步骤以及可变步骤的模板方法。
  • Concrete Class(具体类):继承自抽象类,实现父类中定义的抽象方法,完成算法的一部分。

应用场景:
模板方法模式适用于以下场景:

  • 当多个类有相同的算法结构,但各自的具体实现不同时。
  • 当希望为子类提供一个统一的操作框架,且这些操作大部分是固定的,但某些步骤允许子类自定义时。

例如,在咖啡制作过程中,抽象咖啡类定义了煮咖啡的基本流程(加水、加热、冲泡),而美式咖啡类和拿铁咖啡类则分别实现添加咖啡粉和奶泡这两个可变步骤。

3. 观察者模式详解及其应用场景

详解:
观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

在观察者模式中,通常包含以下角色:

  • Subject(主题/被观察者)接口或抽象类:维护一个观察者列表,并定义添加、删除观察者的方法,以及通知所有观察者的接口。
  • Concrete Subject(具体主题/具体被观察者)类:实现了 Subject,当其状态改变时负责通知所有注册过的观察者。
  • Observer(观察者)接口:定义了当主题状态变化时更新自己的方法。
  • Concrete Observer(具体观察者)类:实现了 Observer 接口,存储对 Concrete Subject 的引用,并在其状态改变时进行响应。

应用场景:
观察者模式适用于以下场景:

  • 当一个对象的改变需要同时改变其他对象,而且不知道具体有多少对象需要被改变时。
  • 当一个对象必须通知其他对象,而并不希望指定这些对象及如何通知它们时。

例如,在气象预报系统中,天气数据作为被观察者,而各种接收设备(如手机APP、网页展示等)作为观察者,当天气数据发生变化时,会自动通知所有订阅了天气数据的服务。

4. 迭代器模式详解及其应用场景

详解:
迭代器模式提供了一种方法顺序访问一个聚合对象的各个元素,而又不暴露其内部的表示。

在迭代器模式中,通常包含以下角色:

  • Iterator(迭代器)接口:定义获取下一个元素、检查是否还有元素的方法。
  • Concrete Iterator(具体迭代器)类:实现 Iterator 接口,遍历集合中的元素。
  • Aggregate(聚合)接口:定义创建迭代器对象的方法。
  • Concrete Aggregate(具体聚合)类:实现 Aggregate 接口,存储元素并返回对应的迭代器实例。

应用场景:
迭代器模式适用于以下场景:

  • 需要对容器内的元素进行顺序访问或随机访问,而又不希望暴露容器的内部结构时。
  • 在处理一组相似类型的对象时,能够提供一致的访问方式。

例如,在Java Collection Framework中,ArrayList、LinkedList等集合类都提供了迭代器,用于遍历集合中的元素。

5. 责任链模式详解及其应用场景

详解:
责任链模式使多个对象都有机会处理请求,避免请求发送者与接收者之间的耦合关系。请求沿着链传递,直到被正确处理为止。

在责任链模式中,通常包含以下角色:

  • Handler(处理器)接口或抽象类:定义处理请求的接口,包含指向下一个处理器的引用。
  • Concrete Handler(具体处理器)类:实现 Handler,能够处理特定的请求,也可以将请求转发给下一个处理器。

应用场景:
责任链模式适用于以下场景:

  • 多个对象可能需要处理同一请求,但是哪个对象处理请求由运行时决定。
  • 请求处理者以及它们之间的关系应当能够在运行时动态地重新配置。

例如,在企业审批流程中,每个审批节点都是一个处理器,根据请求内容的不同,请求从一个节点流向另一个节点,直至找到有权批准该请求的节点。

6. 命令模式详解及其应用场景

详解:
命令模式将请求封装为一个对象,使得可以用不同的请求对客户进行参数化;可以对请求排队或者记录请求日志,以及支持可撤销的操作。

在命令模式中,通常包含以下角色:

  • Command(命令)接口:声明执行命令的方法。
  • Concrete Command(具体命令)类:实现 Command 接口,绑定接收者并调用其操作。
  • Receiver(接收者)类:知道如何实施和执行一个请求相关的操作。
  • Invoker(调用者)类:要求命令对象执行请求。

应用场景:
命令模式适用于以下场景:

  • 需要在不同的时间点执行请求,或者将请求放入队列中。
  • 需要支持命令的撤销操作。
  • 将动作与动作的发起者解耦,使得发起者不必了解接收者细节。

例如,在图形用户界面中,按钮点击事件可以作为一个命令对象,点击后通过调用者触发命令执行,同时支持撤销操作。

7. 备忘录模式详解及其应用场景

详解:
备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将对象恢复到原先保存的状态。

在备忘录模式中,通常包含以下角色:

  • Originator(原发器)类:拥有一个复杂状态的对象,能够创建并恢复备忘录数据。
  • Memento(备忘录)类:存储 Originator 的内部状态,但对外部世界隐藏这些状态的具体信息。
  • Caretaker(管理者)类:持有备忘录对象,但不能对其内容进行操作,只负责保存和恢复。

应用场景:
备忘录模式适用于以下场景:

  • 需要保存和恢复对象的复杂状态,以便撤销操作或回滚到历史状态。
  • 需要在不影响对象本身的情况下保存对象状态。

例如,在文本编辑器中,可以利用备忘录模式保存文档的各个版本,方便用户随时撤销或恢复到某个历史版本。

8. 状态模式详解及其应用场景

详解:
状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

在状态模式中,通常包含以下角色:

  • Context(环境)类:维护一个当前状态对象的引用,并将与状态有关的行为委托给当前状态对象。
  • State(状态)接口:定义所有具体状态类都要实现的接口。
  • Concrete State(具体状态)类:每个具体状态类对应一个状态,实现 State 接口,负责处理与当前状态相关的业务逻辑。

应用场景:
状态模式适用于以下场景:

  • 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变其行为。
  • 避免使用大量的条件语句判断对象的状态。

例如,在ATM机中,账户状态(正常、冻结、透支等)会影响账户的取款、存款等功能,每种状态对应一个具体状态类,根据账户状态执行相应操作。

9. 访问者模式详解及其应用场景

详解:
访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

在访问者模式中,通常包含以下角色:

  • Visitor(访问者)接口:声明访问者可以访问哪些元素以及访问的结果是什么。
  • Concrete Visitor(具体访问者)类:实现了 Visitor 接口,定义对每个元素类的具体操作。
  • Element(元素)接口:声明接受 Visitor 的方法,一般为 accept(Visitor visitor)。
  • Concrete Element(具体元素)类:实现 Element 接口,具体存储数据,并调用访问者的方法。

应用场景:
访问者模式适用于以下场景:

  • 需要在不改变现有类的基础上扩展功能,即需要对一个复杂的对象结构中的元素进行很多不同操作时。
  • 对象结构中元素的类比较稳定,但其操作算法易变或者可能有许多不同的操作算法。

例如,在编译器设计中,可以定义一个抽象语法树(AST),节点代表源代码的不同部分。访问者模式可以用来实现类型检查、代码优化、错误检测等多种独立的遍历和处理逻辑,每种逻辑对应一个具体的访问者类。

10. 中介者模式详解及其应用场景

详解:
中介者模式用一个中介对象来封装一系列的对象交互,使原本直接关联的对象解耦,使得各对象之间不需要显式地相互引用,而是通过中介对象间接通信。

在中介者模式中,通常包含以下角色:

  • Mediator(中介者)接口或抽象类:定义了同事对象与中介者之间的交互方式。
  • Concrete Mediator(具体中介者)类:实现了 Mediator 接口,负责协调各个同事对象之间的交互行为。
  • Colleague(同事)类:定义同事对象,它们只知道中介者而不知道其他同事对象,通过调用中介者的方法与其他同事对象通信。

应用场景:
中介者模式适用于以下场景:

  • 多个对象之间存在复杂的依赖关系,导致系统难以理解和维护。
  • 当需要简化多个对象间的通信复杂性,降低耦合度时。

例如,在GUI框架中,事件调度器(如Java Swing中的Event Dispatch Thread)作为中介者,协调按钮、文本框等各种组件之间的事件传递和响应。

11. 解释器模式详解及其应用场景

详解:
解释器模式提供了一种用于表示可计算语句的语法表示,并定义了一个解释器来解释该表示并执行相应的运算。

在解释器模式中,通常包含以下角色:

  • AbstractExpression(抽象表达式)接口或抽象类:声明解释操作的公共接口,为所有具体表达式类提供统一的操作入口。
  • TerminalExpression(终结符表达式)类:实现抽象表达式接口,对应文法中的终端符号,通常直接产生结果。
  • NonterminalExpression(非终结符表达式)类:同样实现抽象表达式接口,对应文法中的非终结符,通常包含对其他子表达式的引用并进行组合运算。
  • Context(上下文)类:存储解析过程中所需的信息,为解释器提供运行环境。

应用场景:
解释器模式适用于以下场景:

  • 有一个简单的语言需要解释,且语言的规则相对固定且易于建模。
  • 可以将特定领域的问题抽象为一种语言或表达式,且需求是开发能够解释这种语言的解释器。

例如,在SQL查询解析器中,可以使用解释器模式将SQL语句转换成内部数据结构,然后进行查询操作。

12. 综述

通过以上对行为型设计模式的详解和应用场景分析,我们可以看到这些模式都致力于解决对象间交互和职责分配的问题,帮助开发者更好地组织程序结构,提高代码复用性和灵活性。在实际项目中灵活运用这些模式,有助于构建出更加健壮、易于维护和扩展的软件系统。

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

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

相关文章

贪心算法part05 435无重叠区间

435无重叠区间 763 划分字母区间 56合并区间

javascript中location对象的属性与方法

前言 本章介绍js中的location中的属性和方法。 文章目录 前言什么是location为什么要用locationlocation对象属性location对象方法总结 什么是location 在JavaScript中,location 是一个包含当前页面的URL信息的对象。它允许你获取和操作当前页面的URL,比…

速通C语言第十二站 文件操作

系列文章目录 速通C语言系列 速通C语言第一站 一篇博客带你初识C语言 http://t.csdn.cn/N57xl 速通C语言第二站 一篇博客带你搞定分支循环 http://t.csdn.cn/Uwn7W 速通C语言第三站 一篇博客带你搞定函数 http://t.csdn.cn/bfrUM 速通C语言第四站 一篇博客带…

QML 项目中使用 Qt Design Studio 生成的UI界面

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 今天来和大家聊一下 Qt Design Studio 这个软件。这个软件的主要功能是用来快速完成 UI 界面,就和 widget 中的 desig…

Vue.js 中使用 Watch 选项实现动态问题判断与展示答案

组件结构 以下是组件的基本结构&#xff1a; <template><div><!-- 输入框&#xff0c;用于输入问题 --><p>提出一个是/否问题&#xff1a;<input v-model"question" :disabled"loading" /></p><!-- 显示答案 --&…

栈实现后缀表达式的计算

后缀表达式计算 过程分析 中缀表达式 &#xff08;15&#xff09;*3 > 后缀表达式 153* (可参考这篇文章&#xff1a;中缀转后缀) 第一步&#xff1a;我们从左至右扫描 后缀表达式(已经存放在一个字符数组中)&#xff0c;遇到第一个数字字符 ‘1’ 放入栈中第二步&#xf…

市场复盘总结 20240103

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: 方法一:指标选股 select * from dbo.ResultAll where 入选类型 like %指标选股% and 入选日期=20240103;方法二:趋势选股法 1、最低价持续3日上涨 2、均价…

新的一年,新的征程,35岁,再出发!!

2024&#xff0c;迈入新的征程&#xff01;35岁是人生的一个重要阶段&#xff0c;是积累经验、提升自我、迎接挑战的黄金时期&#xff0c;在接下来的日子&#xff1a; 设定目标&#xff1a;明确自己的长期和短期目标&#xff0c;确保自己始终朝着正确的方向前进。目标可以是职…

jmeter线程组

特点&#xff1a;模拟用户&#xff0c;支持多用户操作&#xff1b;可以串行也可以并行 分类&#xff1a; setup线程组&#xff1a;初始化 类似于 unittest中的setupclass 普通线程组&#xff1a;字面意思 teardown线程组&#xff1a;环境恢复&#xff0c;后置处理

机器视觉系统选型-选型-总结

一&#xff1a;明确需求 需求&#xff1a;镜面材质上的划痕检测&#xff0c;传送线上运动过程中拍照&#xff0c;无景深要求&#xff0c;传送线速度0.8m/s&#xff0c;产品间隔50mm 产品大小&#xff1a;100*80mm 工作距离限制&#xff1a;≤ 300mm 最小划痕宽度&#xff1a;0.…

shell编程二

shell 脚本规范 shell脚本文件需要以.sh结尾 第一个原因&#xff0c;让别人认的这个是shell脚本&#xff0c;sh后缀编辑时有高亮显示。 拓展名后缀,如果省略.sh则不易判断该文件是否为shell脚本 ​ # 执行脚本方式 1、 sh 脚本.sh 2、 bash 脚本.sh 3、 ./脚本.sh # 需要执行权…

NVMe SSD IO压力导致宕机案例解读-2

IOVA原理扩展介绍&#xff1a; 在Linux内核的I/O虚拟地址&#xff08;IOVA&#xff09;分配机制中存在两个影响高吞吐量I/O性能的问题 问题1&#xff1a;原有IOVA分配器在分配时可能需要对已分配的IOVA范围进行线性搜索&#xff0c;这种操作效率低下&#xff0c;尤其在大规模…

Day23

Day23 一,file类 1.1file类的初识 import java.io.File; import java.text.SimpleDateFormat;public class Test01 {/*** 知识点&#xff1a;File类* File&#xff0c;是文件和目录路径名的抽象表示* File只关注文件本身的信息&#xff0c;而不能操作文件里面的内容* * File…

AIGC时代-GPT-4和DALL·E 3的结合

在当今这个快速发展的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了我们生活中不可或缺的一部分。从简单的自动化任务到复杂的决策制定&#xff0c;AI的应用范围日益扩大。而在这个广阔的领域中&#xff0c;有两个特别引人注目的名字&#xff1a;GPT-4和D…

webpack 5 mode的作用和区别

通过选择 development, production 或 none 之中的一个&#xff0c;来设置 mode 参数&#xff0c;你可以启用 webpack 内置在相应环境下的优化。其默认值为 production。 会将 DefinePlugin 中 process.env.NODE_ENV 的值设置为 developmen或者production. 为模块和 chunk 启用…

JUC原子操作类

原子操作类 基本类型原子类&#xff1a;AtomicInteger、AtomicBoolean、AtomicLong&#xff0c;常见API&#xff1a; get 获取当前值getAndSet 获取当前的值&#xff0c;并设置新的值getAndIncrement 获取当前的值&#xff0c;并自增getAndDecrement 获取当前的值&#xff0c;并…

洗地机怎么选?哪款洗地机好用?

选择洗地机前&#xff0c;我们需要对自己购买洗地机的需求做一个清洗的判断&#xff0c;吸尘器和扫地机智能解决地面基本的清洁问题&#xff0c;作为新兴的清洁工具洗地机越来越受大家的喜欢&#xff0c;洗地机的品类很多&#xff0c;洗地机到底该买哪款呢?我们先来看看挑选洗…

【现代控制理论】浙江大学 王建全教授

博主主页还有其他上万字精品笔记,欢迎自取 ​编辑P1[1.1.1]--视频&#xff1a;绪论.mp4_高清 1080P 11:19 这个视频是浙江大学的一门精品课程&#xff0c;主要介绍了现代控制理论的基本概念和发展历程。课程包括非线性系统理论、随机控制理论、自适应控制、模糊控制、鲁棒控制…

死锁-第三十四天

目录 什么是死锁 进程死锁、饥饿、死循环的区别 死锁产生的必要条件 什么时候会发生死锁 死锁的处理策略 本节思维导图 什么是死锁 每一个人都占有一个资源&#xff0c;同时又在等待另一个人手里的资源 进程死锁、饥饿、死循环的区别 死锁&#xff1a;各进程互相等待对…

drf序列化与序列化器的使用

序列化类的使用 使用序列化类实现五个接口功能&#xff0c;但是我们发现并没有做数据校验&#xff0c;也没有做反序列化&#xff0c;是我们自己手动去进反序列化&#xff0c;是我们自己使用for来进行拼接的&#xff0c;很不方便&#xff0c;我们可以使用一个drf自带的名叫序列…