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

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

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

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

一、行为型设计模式比较

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

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

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
兔子用什么呼吸,为什么它的呼吸方式如此独特?