命令模式

命令模式

把方法调用封装起来。日志记录,撤销等行为。

命令模式可以将“动作的请求者”从“动作的执行者”对象中解耦。但是当你调用方法的时候,不用执行者对象去调用,怎么可能?利用命令对象,把请求封装成一个特定的对象,当调用请求时,直接用该命令对象调用。而该命令对象组合了执行者对象,这就达到了上述的解耦目的。

这让我想起了,遥控器的学习功能。是不是也是用这种方式进行解耦的。

只要动作调用者用接口调用命令对象,而所有的命令对象都实现这个接口的话,那么动作调用者就可以接收不同的命令对象,达到弹性扩展的目的。

命令模式好玩的变种

撤销和宏命令,撤销是在命令模式中加入undo,即可,只要记录上次的命令对象,就可以调用undo实现灵活的撤销。宏命令即用数组存储一大堆命令对象。宏命令是设置进去的,而不是硬编码进去的,更灵活且更优雅。

应用场景

工作队列,一端塞,另一段取出来,并调用它的execute()方法,等待这个调用完成,然后将此命令对象丢弃,再取出下一个命令。这些命令可以是财务运算,可以是读取网络数据,总是工作队列类和计算的对象之间是完全解耦的。

日志记录:记录操作,我们文件每发生一次改变就保存整个电子表格或者大型数据结构?这样是不划算的。最好的办法是,每隔一段时间有一个checkpoint,之后记录所有的操作记录。恢复的时候,不论是什么操作行为,只要将序列化的命令对象反序列化,再操作一边就可以了。

事物处理:事务地特点是一组操作,支持撤销,和命令模式十分吻合。

聪明的命令对象不委托接收者,傻瓜式的命令对象委托接收者。

总结

如果你想将方法的调用方和被调用方解耦,因为被调用方需要经常改变,那么就把方法封装成类,并用统一的接口管理就可以了。工作队列的消费线程不变,而工作内容是多变的。恢复日志的操作不变,但恢复的内容是多变的。事务的操作方法不变,但事务的内容是多变的。当被调用的方法是变化部分的时候,命令模式就会登场了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值