设计模式之命令模式



本文为简述程序设计的设计模式之一,非普及文章,专业的朋友略看即可。

命令模式

命令模式是指,使用者向接收者发送命令,使用者并不清楚命令如何执行,也不管是怎样的过程。

在实际生活中,音乐播放器就可以看成一个命令模式的设计。我们并不知道如何播放一首歌曲,只需要点击按钮命令即可。至于播放的是MP3还是OGG,如何解码音频,数据如何送达DSP,如何将声音转成模拟信号从扬声器输出等待,我们都不需要知道。

设计模式之命令模式_第1张图片

播放器

命令模式实现

1.定义全局变量标志,比如【Play】、【Pause】、【Next】等。

2.请求方只发送命令:【Play】、【Pause】、【Next】。

3.接收方解析命令,并调用对应的流程实现具体功能。

除了选择不同的命令之外,还可以选择不同的接收者。比如我们需要播放音频和视频,分别要使用音频播放器和视频播放器,但是对于上层的命令是一样的。既然我可以不管MP3还是WMA,我也可以不管这是MP3还是MP4,甚至是PPT。对于用户讲,我可以直接根据文件后缀来判断我应该启动和中关联程序。

对!电脑上双击文件就打开的功能就是这样做的。如果后缀名错了,一般无法自动打开,需要手动选择打开方式。

设计模式之命令模式_第2张图片
设计模式之命令模式_第3张图片

选择不同的命令解析者和接收者

命令模式的使用场景

只要你认为是命令的地方就可以采用命令模式,例如,在GUI开发中,一个按钮的点击是一个命令,可以采用命令模式;模拟DOS命令的时候,当然也要采用命令模式;触发-反馈机制的处理等。

扩展与撤销

我们可以在已有流程上扩展命令。比如播放音乐,开启空调,开启电灯,进入回家模式。或者相反进入出门模式,把所有的电器关闭。

此时,可以创建新的接收者,让新的解析器逐步处理。

撤销类似,记录之前的状态并还原。

当然,实际编程中,我们一般会省略设置和执行的分布,不需要先设置后执行,而是设置了就马上自动执行。

设计模式之命令模式_第4张图片

参考资料

对,我最初看得是这本书。

设计模式之命令模式_第5张图片

实际上这一章看了很久,原因是书中的举例太复杂,描述又不清楚。很多描述用英文原文翻译出来让人一头雾水。举例来说,在《UML 建模、设计与分析》一书中:

4.3.1 依赖关系

模型元素之间的依赖关系描述的是它们之间语义上的关系。当两个元素处于依赖关系中时,其中一个元素的改变可能会影响或提供消息给另一个元素,即一个元素以某种形式依赖于另一元素。 

看明白了吗?没有。实际上,我来写的话,会这样描述:

依赖关系是指,A了解B的使用方法和内容,在特定情况下需要用到B的方法和内容。比如司机和汽车,医生和听诊器,蓝翔同学和挖掘机。

总的来说,命令模式在Head First 设计模式中描述的并不好,所以我参考了以下书籍。

设计模式之命令模式_第6张图片

当然,还有百科全书:菜鸟教程。

你可能感兴趣的:(设计模式之命令模式)