标签:
要解决的问题:
假设想要一个遥控器,控制房间里的各种电器设备该遥控器有如下要求:
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