码迷,mamicode.com
首页 > 其他好文 > 详细

命令模式

时间:2015-09-17 13:29:33      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

要解决的问题:

假设想要一个遥控器,控制房间里的各种电器设备该遥控器有如下要求:

1)遥控器上每个电器设备插槽对应一个电器设备,每个设备具备on和off两个开关;

2)要实现每种设备的开关,所进行的操作是不同的,比如音响需要先插入光盘然后再打开音响的开关,而灯直接打开开关即可;

3)需要撤销操作,可以撤销上一个动作;

4)可以有Party模式,即点击Party开始,可以批量打开多个电器设备,点击Party结束,可以批量关闭多个电器设备。

问题分析:

第一种解决方案:如果遥控器包含每个电器设备,遥控器类的on方法中直接写各种电器设备如何开启,这样做的话,每增加或减少电器设备,或者修改电器设备的开启方法,都需要更新遥控器类中的on方法。遥控器类没有对修改关闭。

第二种解决方案:设置一个父类电器设备类,各类电器设备继承电器设备类,这样各类电器类都必须要实现on和off方法,对于没有on和off方法的电器设备,需要改变电器厂商提供的API,封装出on和off方法。没有使电器API类对修改关闭,同时这种设计要想实现撤销操作很难。

第二种解决方案具备一定程度的优势,即可以让遥控器类对修改关闭,然而想要不改变电器设备的API就必须要增加自己的类来封装出on和off的方法,这样做可以不改变电器厂商API,但是对于撤销操作,和Party模式依然没有改进。没有改进撤销操作的原因是无法记录当前电器设备执行的是on还是off,但如果对象可以变成“电灯on”和“电灯off”,这样电器设备执行了什么便被记录下来了。这样可以设置一个父类,父类叫做电器操作,子类是电灯on,电灯off等。这样相当于将电器及其操作封装到了一块,这样让遥控器类包含电器操作这一父类,然后为电器操作类设置一个excute函数,各个电器操作子类实现各自的excute函数,这样当增加一种新的电器设备时,我们均针对其API为之制定电器操作类,然后将电器操作类注册到遥控器类当中,当点击新增电器的on按钮的时候,对应电器操作类的excute函数被执行,实现了遥控器和电器API对修改关闭。在电器操作类中设置一个undo函数,各个电器操作子类实现各自的undo函数(电灯on类中的undo函数中调用的是off函数),在遥控器类中增加电器操作对象undocommand,当点击电器的on按钮的时候,通过对象undocommand记录当前的电器设备和操作,当点击undo按钮的时候,利用undocommand.undo()实现撤销。

问题的解决(第三种解决方案):

如上所述的方法就是命令模式。

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

命令模式类图:

技术分享

命令模式

标签:

原文地址:http://www.cnblogs.com/lisiyuannnn/p/4815631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!