设计模式阅读笔记(6)--------------命令模式

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

为什么需要使用命令模式?使用命令模式有什么好处?按模式UML图来看,客户是知道需要调用哪些具体的命令的,为什么还要通过调用者来调用呢?看起来似乎有点多此一举啊。但是在实际操作中,客户的请求并不是马上被执行的,可是客户将请求提出后,由调用者来请求执行,然后执行者执行动作。动作多种多样,而且必须考虑到会有新动作或新执行者的加入,命令模式就是为了将调用者和执行者解耦的。用现实生活中例子来说,灯是一个执行者,有动作开灯和关灯。如果调用者直接执行灯的开灯和关灯方法,这样调用者就和灯有耦合。如果解除这种耦合,我们加入命令接口,让命令对象封装开灯方法,这样,对调用者来说,只要执行命令对象就可以,不用关心该命令对象的类型。

命令模式如图:


对客户来说,必须知道需要什么功能,因此依赖Receiver,要将Receiver封装入ConcreteCommand中,生成对应的命令,然后调用Invoker的setCommand将ConcreteCommand传入。对于调用者Invoker来说,并不关心传入的是哪种具体的Command,只要实现了Command接口就行。这是Invoker和ConcreteCommand已经解耦了,只需要在需要执行相应动作的时候调用executeCommand即可。

具体举例来说:有Light(Receiver)类,该类有两个action:lightON(),lightOFF(),选择lightON封装入LightONCommand(ConcreteCommand)中,其中execute()方法中执行lightON()。然后调用Invoker的setCommand方法将LightONCommand传入。至此Client的事情就做完了,提交了命令。之后由Invoker执行命令,调用executeCommand方法,使用LightONCommand对象执行execute方法。

当然,Invoker可以保存许多命令的引用来执行,并且可以实现undo来撤销命令。


通过以上分析,命令模式的用法在实现队列非常有用,客户提交命令,命令进入工作队列中,交予调用者执行。调用者并不关注命令的具体内容。比如多线程的执行,处理器当可以的时候,调用command类的execute即可。同时如果应用需要记录操作以便恢复(日志功能),该模式也可以很好的实现,只要实现command 的store方法,将操作记录即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值