软件设计师之行为型设计模式深度剖析:模式比较与应用实例

软件设计师之行为型设计模式深度剖析:模式比较与应用实例

软件设计师之行为型设计模式深度剖析:模式比较与应用实例

大家好!在软件开发的学习和实践中,我发现行为型设计模式种类繁多且各有特点,深入理解它们对于提升代码质量和解决实际问题非常有帮助。今天,咱们继续深入探讨行为型设计模式,主要聚焦于模式之间的比较以及实际应用举例,希望能在交流中共同进步,更熟练地运用这些模式。

一、行为型设计模式比较

很多行为型设计模式的核心在于封装变化,当程序中某个方面的特征频繁改变时,通过定义相关对象来封装这一变化,从而降低程序其他部分与该变化的耦合度。

(一)封装变化对象的模式

Strategy(策略):封装一个算法,使得算法可以独立于使用它的客户而变化。例如,在一个电商系统中,计算商品折扣的算法有多种(如固定折扣、满减折扣等),使用策略模式可以将这些算法封装起来,客户可以根据实际需求选择不同的折扣算法,而不需要修改系统的其他部分。

State(状态):封装与状态相关的行为。以游戏角色为例,角色在不同状态(如正常、中毒、隐身)下有不同的行为表现,状态模式将这些与状态相关的行为封装在不同的状态类中,当角色状态改变时,其行为也相应改变。

Mediator(中介者):封装对象间的协议,使对象之间的交互通过中介者进行,降低对象之间的耦合度。在一个图形界面系统中,多个组件(如按钮、文本框、下拉菜单等)之间的交互复杂,使用中介者模式可以将这些交互封装在中介者对象中,组件只需要与中介者通信,简化了组件之间的关系。

Iterator(迭代器):封装访问和遍历一个聚集对象中各个组件的方法。比如在遍历一个列表时,迭代器模式提供了一种统一的方式来访问列表中的元素,而不需要暴露列表的内部结构。

(二)参数对象与令牌对象

Visitor(访问者):Visitor对象作为多态的Accept操作的参数,作用于被访问的对象。在一个文件系统中,文件和文件夹是不同类型的对象,定义一个访问者来计算文件大小或显示文件路径等操作,访问者对象可以作为参数传递给文件或文件夹对象的Accept操作,实现对不同对象的统一操作。

Command(命令)和Memento(备忘录):Command对象代表一个请求,Memento对象代表一个对象在某个特定时刻的内部状态,它们都可作为令牌进行传递。在一个文本编辑软件中,Command对象可以封装“复制”“粘贴”等操作,方便进行操作的记录和撤销;Memento对象可以保存文本编辑的某个状态,以便恢复到之前的编辑状态。

(三)解耦模式的差异

Command模式:使用Command对象定义发送者和接收者之间的绑定关系,通过Execute操作提交请求,实现发送者和接收者的解耦,使发送者更易于复用,也可以用不同的发送者参数化接收者。例如,在一个图形绘制系统中,“绘制圆形”“绘制矩形”等操作可以封装成Command对象,发送者(如用户操作)通过调用Command对象的Execute方法,由接收者(图形绘制模块)执行相应操作,实现发送者和接收者的解耦。

Observer模式:通过定义接口通知目标中发生的改变,将发送者(目标)与接收者(观察者)解耦。一个目标可以有多个观察者,并且观察者的数目可以在运行时变化。在一个新闻发布系统中,新闻发布者是目标,订阅者是观察者,当有新新闻发布时,发布者通知所有订阅者,实现了发布者和订阅者的解耦。

Mediator模式:让对象通过一个Mediator对象间接相互引用,对对象进行解耦。Mediator对象为各Colleague对象间的请求提供路由,并集中它们的通信。在一个即时通讯系统中,用户之间的消息传递通过中介者对象进行,避免了用户对象之间的直接引用,降低了耦合度。

Chain of Responsibility模式:通过沿一个潜在接收者链传递请求而将发送者与接收者解耦。在一个审批流程中,请假申请从一个审批者传递到下一个审批者,直到有审批者处理该请求,实现了发送者(请假者)和接收者(审批者)的解耦。

模式名称

封装内容

参数/令牌对象

解耦方式

应用场景举例

Strategy

算法

无

将算法封装,使算法独立于客户

电商系统中计算商品折扣的不同算法

State

与状态相关的行为

无

根据对象状态改变行为

游戏角色在不同状态下的行为变化

Mediator

对象间的协议

无

通过中介者对象间接通信

图形界面系统中组件间的交互

Iterator

访问和遍历聚集对象组件的方法

无

提供统一遍历方式,不暴露内部结构

遍历列表或集合

Visitor

作用于对象结构元素的操作

Visitor对象作为Accept操作参数

通过访问者对象实现对不同对象的统一操作

文件系统中对文件和文件夹的统一操作

Command

请求

Command对象作为请求令牌

定义发送者和接收者的绑定关系,通过Execute操作提交请求

图形绘制系统中的绘制操作

Memento

对象某时刻的内部状态

Memento对象作为状态令牌

保存和恢复对象状态

文本编辑软件的撤销操作

Observer

目标与观察者的依赖关系

无

通过接口通知目标变化

新闻发布系统中发布者与订阅者的关系

Chain of Responsibility

请求处理链

无

沿接收者链传递请求

审批流程

二、应用举例 - Visitor模式

在一个图书管理系统中,管理着图书和论文两种文献类型,现在需要统计所有馆藏文献的总页码。这种情况适合使用Visitor模式,因为对象结构(图书和论文)相对稳定,但需要对不同类型的对象(图书和论文)实施依赖于其具体类的操作(统计页码)。

下面用Java代码示例展示Visitor模式在该场景中的应用:

import java.util.ArrayList;

import java.util.List;

// 文献接口

interface LibraryItem

相关推荐

道歉挽回——如何用最触动人心的友情话语化解冲突(15个段落教你如何挽回友情)
5、神武109到120需要多少经验
菠菜365哪个是真的

5、神武109到120需要多少经验

⌛ 07-03 👁️ 3445
[世界杯]C组:秘鲁0-1丹麦 比赛集锦
速发365网址

[世界杯]C组:秘鲁0-1丹麦 比赛集锦

⌛ 07-07 👁️ 2454
【悬赏贴】第二轮猜胜负来啦!阿根廷or克罗地亚? 上周五晚巴西队饮恨憾别世界杯,克罗地亚顽强闯进四强!恭喜站克罗地亚的8位诸葛亮获得首轮猜胜负奖励!第二轮猜胜负的集结号已...
征集志愿一般降多少分?录取几率大吗?附填报流程
菠菜365哪个是真的

征集志愿一般降多少分?录取几率大吗?附填报流程

⌛ 07-12 👁️ 1124
兔子用什么呼吸,为什么它的呼吸方式如此独特?