行为型设计模式的全面解析

news/2024/9/24 6:45:25/

行为型设计模式是软件设计模式中的一种,主要关注对象之间的交互和职责分配。它们通过定义对象之间的通信方式,使得系统的结构更加清晰,代码更加易于维护和扩展。本文将对比总结11种常见的行为型设计模式,包括策略模式、观察者模式、命令模式、迭代器模式、模板方法模式、职责链模式、状态模式、解释器模式、中介者模式、备忘录模式和访问者模式。

一,模板方法模式(Template Method Pattern)

定义:模板方法模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

优点

  1. 提高代码复用性。
  2. 提高扩展性。
  3. 符合开闭原则。

缺点

  1. 每个不同的实现都需要一个子类来实现,导致类的数量增加。
  2. 增加了系统的复杂度。

应用场景

  1. 多个类有相似的行为逻辑。
  2. 需要通过子类来实现具体步骤的情况。

点击查看模板方法模式详解

二,中介者模式(Mediator Pattern)

定义:中介者模式定义了一个中介对象来封装一系列对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,可以独立地改变它们之间的交互。

优点

  1. 降低了对象之间的耦合性,使得对象易于独立地被复用。
  2. 将对象之间的交互封装在中介者中,易于维护。

缺点

  1. 中介者模式会导致中介者对象变得复杂。
  2. 可能会导致系统性能问题。

应用场景

  1. 系统中对象之间存在复杂的引用关系,导致依赖关系结构混乱且难以复用的情况。
  2. 需要通过一个中介者来控制对象之间的交互的情况。

点击查看中介者模式详解

三,命令模式(Command Pattern)

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

优点

  1. 降低系统耦合度。
  2. 增加或删除命令非常灵活。
  3. 可以实现撤销和重做功能。

缺点

  1. 可能会导致系统中类的数量增加。
  2. 可能会导致复杂度增加。

应用场景

  1. 需要对行为进行参数化的情况。
  2. 需要支持撤销和重做的情况。

点击查看命令模式详解

四,责任链模式(Chain of Responsibility Pattern)

定义:责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的发送者和接收者之间的解耦,使得多个对象都有机会处理这个请求。

优点

  1. 低耦合。请求者和处理者解耦。
  2. 动态组合。可以动态地添加或修改处理者。

缺点

  1. 可能会导致请求处理的复杂性增加。
  2. 不保证请求一定会被处理。

应用场景

  1. 有多个对象可以处理同一个请求,但具体哪个对象处理需要在运行时决定。
  2. 需要动态指定处理者的情况。

点击查看责任链模式详解

五,策略模式(Strategy Pattern)

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

优点

  1. 易于切换算法。
  2. 避免使用多重条件语句。
  3. 提高代码的可读性和可维护性。

缺点

  1. 客户端必须了解所有策略。
  2. 可能会有过多的策略类。

应用场景

  1. 需要动态选择算法的情况。
  2. 需要避免多重条件判断的情况。

点击查看策略模式详解

六,迭代器模式(Iterator Pattern)

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

优点

  1. 支持以不同方式遍历一个聚合对象。
  2. 简化了聚合对象的接口。

缺点

  1. 增加了类的数量。
  2. 可能会导致复杂度增加。

应用场景

  1. 需要遍历一个聚合对象的情况。
  2. 需要提供多种遍历方式的情况。

点击查看迭代器模式详解

七,观察者模式(Observer Pattern)

定义:观察者模式定义了一种一对多的依赖关系,使得多个观察者对象能够监听某一个主题对象。当主题对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

优点

  1. 实现了对象之间的松耦合。
  2. 支持广播通信。

缺点

  1. 可能会导致内存泄漏(如果没有正确管理观察者的注册和注销)。
  2. 观察者之间的依赖关系可能会变得复杂。

应用场景

  1. 一个对象的改变需要通知其他对象的情况。
  2. 需要实现事件机制的情况。

点击查看观察者模式详解

八,备忘录模式(Memento Pattern)

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

优点

  1. 提供了一种恢复状态的机制。
  2. 实现了信息的封装,使得外界无法访问到对象的内部状态。

缺点

  1. 可能会消耗较多资源。
  2. 如果对象的状态过多,会导致备忘录对象占用较多的内存。

应用场景

  1. 需要保存和恢复对象的状态的场景。
  2. 需要提供撤销操作的场景。

点击查看备忘录模式详解

九,访问者模式(Visitor Pattern)

定义:访问者模式封装了一些作用于某种数据结构中的各元素的操作。它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

优点

  1. 增加新的操作很容易。
  2. 使得相关操作集中在一个访问者对象中。

缺点

  1. 增加新的数据结构很困难。
  2. 可能会导致系统复杂性增加。

应用场景

  1. 需要对一个对象结构中的对象进行很多不同的且不相关的操作,而需要避免让这些操作“污染”这些对象的类。
  2. 需要对一个对象结构中的对象进行很多不同操作的情况。

点击查看访问者模式详解

十,状态模式(State Pattern)

定义:状态模式允许对象在其内部状态改变时改变其行为。对象看起来好像修改了它的类。

优点

  1. 将与特定状态相关的行为局部化。
  2. 使得状态转换显式化。

缺点

  1. 状态模式会增加系统类和对象的个数。
  2. 可能会导致系统复杂性增加。

应用场景

  1. 对象的行为依赖于其状态,并且可以根据状态改变其行为。
  2. 需要通过状态来控制对象行为的情况。

点击查看状态模式详解

十一,解释器模式(Interpreter Pattern)

定义:解释器模式提供了评估语言的语法或表达式的方式。模式实现一个表达式接口,该接口解释一个特定的上下文。

优点

  1. 易于改变和扩展文法。
  2. 每一条语法规则可以表示为一个类,易于维护。

缺点

  1. 解释器模式会引起类膨胀。
  2. 解释器模式采用递归调用方法。

应用场景

  1. 需要解释一种语言的场景。
  2. 需要执行复杂的业务规则的情况。

点击查看解释器模式详解


http://www.ppmy.cn/news/1529693.html

相关文章

【Unity3d Shader】毛玻璃效果

毛玻璃也叫​磨砂玻璃​:是用物理或化学方法处理过的一种表面粗糙不平整的半透明玻璃。 毛玻璃成像原理:毛玻璃表面不平整,光线通过毛玻璃被反射后向四面八方射出去(因为毛玻璃表面不是光滑的平面,使光产生了漫反射),折射到视网膜上已经是不完整的像,于是就看不清楚(…

ruoyi源码解析学习 - 微服务版 - ruoyi-gateway

com.ruoyi.gateway 今天简单看看若依的gateway的配置模块干了啥 最近面试很多外包公司,都对低代码平台有点要求,这些代码虽说用起来不费劲,但是其中还是有很多细节能让我学习学习的。(微服务版,上次搞jeecgboot的笔试…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Trace调测】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Trace调测旨在帮助开发者获取内核的运行流程&#xff0c…

Highcharts甘特图基本用法(highcharts-gantt.js)

参考官方文档: https://www.highcharts.com/docs/gantt/getting-started-gantt https://www.highcharts.com/demo/gantt/project-management https://www.hcharts.cn/demo/gantt 链接在下面按需引入 https://code.highcharts.com/gantt/highcharts-gantt.js htt…

WebGL颜色与纹理

WEBGL中的着色器变量包括以下种类: 属性变量(Attribute Variables):这些变量用于接收从应用程序中传递的顶点数据,比如顶点位置和颜色,是只读的不可修改。统一变量(Uniform Variables&#xff…

PHP邮件发送教程:如何用PHP发送电子邮件?

php邮件怎么实现发送电子邮件?php怎么给邮箱发邮件? PHP作为一种广泛使用的服务器端脚本语言,提供了多种方法来实现电子邮件的发送。AokSend将详细介绍如何使用PHP邮件功能来发送电子邮件,帮助开发者轻松实现这一重要功能。 PHP…

思维链在论文写作中的应用:借助ChatGPT构建完整、清晰的论证

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 “思维链”(Chain of Thought,CoT)是一种通过逐步推理来解决复杂问题的方法,这种方法能够提高AI在某些任务上的表现。在论文写作中&#…

C++ | Leetcode C++题解之第432题全O(1)的数据结构

题目&#xff1a; 题解&#xff1a; class AllOne {list<pair<unordered_set<string>, int>> lst;unordered_map<string, list<pair<unordered_set<string>, int>>::iterator> nodes;public:AllOne() {}void inc(string key) {if (…