设计模式(六)之命令模式

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

命令模式其实主要就是将方法调用封装起来,当你知道某个方法的功能,你只要直接调用它就行,至于内部怎样,你不需要去知道,这样是不是就更符合Java的面向对象编程,而且还更容易理解呢,可能看完这句话会觉得平时都是这么编程的,不过命令模式可不止就只是这一种“编程规范”呢。有时候要调用一个类中的方法,我们会直接new出那个类,然后.method(),这样是直接将两个类进行关联,这时我们可以考虑下是否有可以有个中间接口来对这两个类进行解耦。下面是一个使用实例:就拿家里的家居来说,比如开灯,传统的灯都是我们要自己走到开关面前,然后打开灯,是不是很不方便呢,哪天你在1楼要打开3楼的灯,你还得走到3楼,很麻烦。21世纪我们讲究的是智能,因此这个时候就可以考虑下如果通过手机或者遥控器按一下,然后就实现开灯的操作,这里的“手机”、“遥控器”就相当于中间接口,至于接口里面的方法是怎么执行的,只需要在被调用的类的方法中写你自己的实现即可,下面是中间接口的代码:

public interface Command {public void execute();}现在“灯的打开操作”交给中间接口:

public class LightOnCommand implements Command{Light light;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {light.on();}}public class Light {public void on() {System.out.println("灯亮了");}}现在我们测试下代码:

public class RemoteControlTest {public static void main(String[] args) {Light light = new Light();LightOnCommand lightOn = new LightOnCommand(light);lightOn.execute();}}

是不是通过中间接口就实现了远程控制灯的开关呢。可能有些人会说,你这不是简单问题复杂化了么,直接像下面这样调用照样行么?代码:

public class TraditionalControl {public static void main(String[] args) {Light light = new Light();light.on();}}是的,而且代码还少了一行呢,开玩笑的。突然有一天你发现你家里所有人都要有一个遥控器放自己房间,你会发现很多地方都是像上面的代码两行飘过,你可能还是没发现什么问题,有一天你家停电了,你还拼命按遥控器,以为它坏了,NO~NO~NO~这时候遥控厂商就要考虑遥控器的严谨性了,on()方法需要有一个状态参数,表示当前是否是断电状态。。。然后就厂商疯了,Light类里面的on()方法加了一个参数之后,厂商已经生产了1000个遥控器,然后都是直接“两行代码调用”!就是说,厂家要把这1000个遥控全部拆开只为加入一个参数,这能不疯么?这个时候回想下命令模式,如果多了个中间类,那我还需要关心这个问题么?NO~NO~NO~,只要修改“灯的打开操作类”execute()方法里on的方法之后,依旧会实现相应的功能,至于方法你怎么改,都不影响。所以,有时候为了代码能更好的维护,避免灾难的降临,通过这种命令模式对方法的调用进行封装还是一个不错的选择。

,不是每个人都一定快乐,不是每种痛都一定要述说。

设计模式(六)之命令模式

相关文章:

你感兴趣的文章:

标签云: