设计模式系列六 命令模式介绍

本文介绍了软件设计中的命令模式,包括其实现原理、应用案例及其在队列请求、日志记录及事务处理中的作用。

一、认识命令模式(最简单的命令模式)

1、实现命令接口,让所有的命令对象实现相同的包含一个方法的接口。图01.jpg

141539_PM21_2269952.jpg

2、现在,假设想实现一个打开电灯的命令,Light类有两个方法:on()和off()。将它实现成一个命令。图02.jpg

141559_usEq_2269952.jpg

3、使用命令对象。假设我们有一个遥控器,它只有一个按钮,可一个控制一个装置。图03.jpg

141616_DveZ_2269952.jpg

4、遥控器使用的简单测试。图04.jpg

142023_nAKc_2269952.jpg

    从上面的一系列的图可以看出:封装是其核心。

我们把封装带到了一个全新的境界:把方法调用(Method invocation)封装起来。通过封装方法调用,我们可以把运算块包装成形。所以调用此运算的对象不需要关心事情是如何进行的,只要知道如何使用包装成形的方法来完成它就可以。通过封装方法调用,也可以做一些很聪明的事情,例如记入日志,或者重复使用这些封装来实现撤销(undo)。

二、定义命令模式

命令模式 将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。图05.jpg

142145_MWAa_2269952.jpg

现在,仔细看这个定义。我们知道一个命令对象通过在特定接受者上绑定一组动作来封装一个请求。要达到这一点,命令对象将动作和接受者包进对象中。这个对象只暴露出一个execute()方法,当此方法被调用的时候,接受者就会进行这些动作。从外面来看,其他对象不知道究竟哪个接受者进行了哪些动作,只知道如果调用execute()方法,请求的目的就能达到。

定义命令模式的类图:图06.jpg

142209_Lebt_2269952.jpg

三、命令模式的更多用途

1、队列请求

命令可以将运算块打包(一个接受者和一组动作),然后将它传来传去,就像是一般的对象一样。现在,即使在命令对象被创建许久之后,运算依然可以被调用。事实上,它甚至可以在不同的线程中被调用。我们可以利用这样的特性衍生一些应用,例如:日程安排、线程池和工作队列等。

想象有一个工作队列:你在某一端添加命令,然后另一端则是线程。线程进行下面的动作:从队列中取出一个命令,调用它的execute()方法。等待这个调用完成,然后将此命令对象丢弃,再取出下个命令……。请注意,工作队列类和进行计算的对象之间完全是解耦的。图07.jpg

142822_XElg_2269952.jpg

2、日志请求

某些应用需要我们将所有的动作都记录在日志中,并能在系统死机之后,重新调用这些动作恢复到之前的状态。通过新增两个方法(store()、load()),命令模式就能够支持这一点。图08.jpg。在java在中,我们可以利用对象的序列化实现这些方法,但是一般认为序列化最好还是只用在对象的持久化上。

142854_vASA_2269952.jpg

要怎么做呢?当我们执行命令的时候,将历史记录存储在磁盘中。一旦系统死机,我们就可以将命令对象重新加载,并成批地依次调用这些对象的execute()方法。

有这样的场景:有许多调用大型数据结构的动作的应用无法在每次改变发生时被快速地存储。通过使用记录日志,我们可以将上次检查点(checkpoint)之后的所有操作记录下来,如果系统出了问题,从检查点开始应用这些操作。比方说,对于电子表格应用,我们可以想要实现的错误恢复方式是将电子表格的操作记录在日志中,而不是每次电子表格一有变化就记录整个电子表格。对更高级的应用而言,这些技巧可以被扩展应用到事务处理中,也就是说,一整群操作必须全部进行完成,或者没有进行任何操作。图09.jpg

142929_vJ37_2269952.jpg

四、回顾要点

1、命令模式将发出请求的对象和执行请求的对象解耦

2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接受者和一个或一组动作。

3、调用者通过调用命令对象的exe()发出支持请求,这会使得接受者的动作被调用。

4、调用者可以接受命令当做参数,甚至在运行时动态地进行。

5、命令可以撤销,做法是实现一个undo()方法来回到execute()被执行前的状态。

6、宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销。

7、实际操作时,很常见使用“聪明”命令对象,也就是直接实现了请求,而不是将工作委托给接受者。

8、命令也可以用来实现日志和事务系统。


转载于:https://my.oschina.net/u/2269952/blog/368846

AI-PPT 一键生成 PPT:用户输入主题关键词,AI-PPT 可快速生成完整 PPT,涵盖标题、正文、段落结构等,还支持对话式生成,用户可在 AI 交互窗口边查看边修改。 文档导入转 PPT:支持导入 Word、Excel、PDF 等多种格式文档,自动解析文档结构,将其转换为结构清晰、排版规范的 PPT,有保持原文和智能优化两种模式。 AI-PPT 对话 实时问答:用户上传 PPT 或 PPTX 文件后,可针对演示内容进行提问,AI 实时提供解答,帮助用户快速理解内容。 多角度内容分析:对 PPT 内容进行多角度分析,提供全面视野,帮助用户更好地把握内容结构和重点。 多语言对话支持:支持多语言对话,打破语言障碍,方便不同语言背景的用户使用。 AI - 绘图 文生图:用户输入文字描述,即可生成符合语义的不同风格图像,如油画、水彩、中国画等,支持中英文双语输入。 图生图:用户上传图片并输入描述,AI - 绘图能够根据参考图和描述生成新的风格化图像,适用于需要特定风格或元素的创作需求。 图像编辑:提供如 AI 超清、AI 扩图、AI 无痕消除等功能,用户可以上传图片进行细节修改和优化,提升图片质量。 AI - 文稿 文案生成:能够根据用户需求生成多种类型的文章,如市场营销文案、技术文档、内部沟通内容等,提升文案质量和创作效率。 文章润色:对已有文章进行改善和优化,包括语言表达、逻辑连贯性、内容流畅度等方面,使文章更符合用户期望和风格。 文章续写:AI 技术理解文本语境,为用户提供新的想法、补充资料或更深层次的见解,帮助用户丰富文档内容。 AI - 医生 智能健康咨询:包括症状自查,用户输入不适症状,AI 结合病史等信息提供疾病可能性分析与初步建议;用药指导,支持查询药品适应症、禁忌症等,并预警潜在冲突;中医辨证,提供体质辨识与调理建议。 医学报告解读:用户上传体检报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值