本文为简述程序设计的设计模式之一,非普及文章,专业的朋友略看即可。
命令模式
命令模式是指,使用者向接收者发送命令,使用者并不清楚命令如何执行,也不管是怎样的过程。
在实际生活中,音乐播放器就可以看成一个命令模式的设计。我们并不知道如何播放一首歌曲,只需要点击按钮命令即可。至于播放的是MP3还是OGG,如何解码音频,数据如何送达DSP,如何将声音转成模拟信号从扬声器输出等待,我们都不需要知道。
播放器
命令模式实现
1.定义全局变量标志,比如【Play】、【Pause】、【Next】等。
2.请求方只发送命令:【Play】、【Pause】、【Next】。
3.接收方解析命令,并调用对应的流程实现具体功能。
除了选择不同的命令之外,还可以选择不同的接收者。比如我们需要播放音频和视频,分别要使用音频播放器和视频播放器,但是对于上层的命令是一样的。既然我可以不管MP3还是WMA,我也可以不管这是MP3还是MP4,甚至是PPT。对于用户讲,我可以直接根据文件后缀来判断我应该启动和中关联程序。
对!电脑上双击文件就打开的功能就是这样做的。如果后缀名错了,一般无法自动打开,需要手动选择打开方式。
选择不同的命令解析者和接收者
命令模式的使用场景
只要你认为是命令的地方就可以采用命令模式,例如,在GUI开发中,一个按钮的点击是一个命令,可以采用命令模式;模拟DOS命令的时候,当然也要采用命令模式;触发-反馈机制的处理等。
扩展与撤销
我们可以在已有流程上扩展命令。比如播放音乐,开启空调,开启电灯,进入回家模式。或者相反进入出门模式,把所有的电器关闭。
此时,可以创建新的接收者,让新的解析器逐步处理。
撤销类似,记录之前的状态并还原。
当然,实际编程中,我们一般会省略设置和执行的分布,不需要先设置后执行,而是设置了就马上自动执行。
参考资料
对,我最初看得是这本书。
实际上这一章看了很久,原因是书中的举例太复杂,描述又不清楚。很多描述用英文原文翻译出来让人一头雾水。举例来说,在《UML 建模、设计与分析》一书中:
4.3.1 依赖关系
模型元素之间的依赖关系描述的是它们之间语义上的关系。当两个元素处于依赖关系中时,其中一个元素的改变可能会影响或提供消息给另一个元素,即一个元素以某种形式依赖于另一元素。
看明白了吗?没有。实际上,我来写的话,会这样描述:
依赖关系是指,A了解B的使用方法和内容,在特定情况下需要用到B的方法和内容。比如司机和汽车,医生和听诊器,蓝翔同学和挖掘机。
总的来说,命令模式在Head First 设计模式中描述的并不好,所以我参考了以下书籍。
当然,还有百科全书:菜鸟教程。