软件设计师之行为型设计模式深度剖析:模式比较与应用实例
大家好!在软件开发的学习和实践中,我发现行为型设计模式种类繁多且各有特点,深入理解它们对于提升代码质量和解决实际问题非常有帮助。今天,咱们继续深入探讨行为型设计模式,主要聚焦于模式之间的比较以及实际应用举例,希望能在交流中共同进步,更熟练地运用这些模式。
一、行为型设计模式比较
很多行为型设计模式的核心在于封装变化,当程序中某个方面的特征频繁改变时,通过定义相关对象来封装这一变化,从而降低程序其他部分与该变化的耦合度。
(一)封装变化对象的模式
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