设计模式之命令模式
在日常生活中,我们常常会遇到这样一些问题:需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。
命令模式是非常实用的一个模式,比如最常用的就是我们编写项目中用到的撤销\恢复(Undo\Redo)就是通过命令模式(Command)来实现的;在如我们的计算器、小孩通过遥控器控制赛车运动,这些都是通过命令模式实现的,下面就详细讲解命令模式.
一.模式定义
命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式.
在命令模式中发送者与接收者没有直接引用关系,发送请求的对象至需要知道如何发送请求,而不必知道如何完成请求,这就是命令模式的模式动机.
二.模式结构及组成
命令模式的结构图如下图所示:
其中命令模式的角色如下所示:
客户端(Client):创建一个具体的命令对象,并确定其接收者.
请求者(Invoker):负责发出命令请求.
接收者(Receiver):具体实施或执行一个请求.
抽象命令(Command):给出所有具体命令的抽象接口.
具体命令(ConcreteCommand):实现抽象命令的方法,负责调用接收者.
先举一个简单的例子:
1.玉帝下旨让太白金星去招悟空上天庭
在这个例子中共有五个角色:命令角色:圣旨 ,具体命令角色:具体圣旨,立即上天庭报道,请求者角色:太白金星,接受者角色:美猴王,客户角色:Client玉帝.
它的模式图如下,这就是一个简单的命令模式的例子.
2.电视机遥控器
电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。显然,电视机遥控器就是一个典型的命令模式应用实例。 其中:
接受者--Televison 请求者--Controller 抽象命令--AbstractCommand 具体命令--TCOpenCommand、TVChangeCommand、TVCloseCommand 其中,在项目中的撤销\恢复(Undo\Redo)也是使用经典的命令模式,这里就简单的给出它的类图,详细的Undo\Redo可见TerryLee的博客,他进行了详细的讲解并有源代码注释: http://terrylee.cnblogs.com/archive/2006/07/17/Command_Pattern.html
3.Undo\Redo 请求者可以请求命令执行Display、Undo、Redo的操作队接受者(文章或工程)进行修改。 四.实例代码详解模式 下面通过股票交易系统的例子和详细代码分析命令模式 (由于忘记该代码是借鉴了某人的博客,在此处向他表示了对不起,作者只想借鉴你优秀的代码供大家学习,而当初没有记录下你的网址,在此说声抱歉.) 具体的代码实现如下: 定义客户端代码,联系请求者、接受者和具体的买卖命令 定义股票交易员,请求者 定义抽象命令接口 定义股票市场,是具体的接受者,执行股票交易操作命令 定义具体的命令,它继承抽象命令接口,在具体类中定义了具体要执行的函数. 五.优缺点 最后,总结命令模式的优缺点。 优点:
1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中。
3.可以比较容易地设计一个组合命令。
4.调用同一方法实现不同的功能
5.可以用来做批处理操作
6.Undo\Redo操作 缺点:
因为每一个命令都需要设计一个具体命令类,所以可能会导致系统有过多的具体命令类,影响使用。
最后,我这篇文章主要讲诉的是命令模式,并通过命令模式一些例子来叙述,同时该文章主要思想来自:作者Eastmount自己的思考,《大话设计模式》,《head first设计模式》等书,还有是清华大学的课件,以及一些其他人关于命令模式的博客文章,但由于作者的大意,找不到有些图来自哪?所以如果作者见到,请见谅,我主要是想分享自己的一些知识供大家学习和了解。如果有错误或不足之处,请读者原谅!!!
(By:Eastmount 2013-5-12-夜2点)
【设计模式】Java设计模式 - 命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
【设计模式】命令模式 读完单例模式,接着品命令模式,命令模式在工程实践中有应用,如MVC框架中使用了命令模式,还有日志系统(从异常中恢复)和事务系统都可以使用命令模式,命令模式可以解耦命令请求者和命令执行者,下面开始学习命令模式。
相关文章
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
- 命令模式
- 大数据产业发展 三大模式可毕其功于一役
- C#设计模式——命令模式(Command Pattern)
- 使用命令行使Windows进入睡眠或休眠模式
- 【Linux基础】VI命令模式下删除拷贝与粘贴
- 【Linux基础】VI命令模式下大小写转换
- 使用命令行使Windows进入睡眠或休眠模式
- 设计模式--命令模式(Command)
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
- typescript tsc命令监视模式--watch的使用
- C# 命令模式
- C++设计模式详解之命令模式解析
- 实践GoF的23种设计模式:命令模式
- 设计模式的C语言应用-命令模式-第五章
- python 设计模式之命令(Command)模式
- Linux的vim三种模式及命令
- Java设计模式菜鸟系列(七)命令模式建模与实现
- 23种设计模式(3):抽象工厂模式
- PostgreSQL的学习心得和知识总结(七十六)|深入理解PostgreSQL数据库客户端工具psql元命令 扩展表格式化模式 的作用原理和使用方法
- 普通用户登录后, 修改系统配置文件需要切换到超级用户模式, 在终端窗口里面输入命令后回车: $sudo -s
- 命令模式
- 设计模式----责任链模式
- 我用过的设计模式(10)-- 命令模式