behavior:命令模式 (Command Pattern)

2019-03-02  本文已影响0人  柳源居士

把方法调用(method invocation)封装起来。通过封装方法调用,可以用来记录日志、或者重复使用这些封装来实现撤销操作。

定义:
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。

命令模式的更多用途:队列请求
把命令打包成一组,然后一个一个执行

命令模式的更多用途:日志请求
将操作记录下来,如果系统有异常,从异常点开始进行日志操作。
对于更高级的应用,命令模式可以扩展到事务处理中,就是指一群操作必须全部完成,要么不进行任何操作。

类图.png

实现:

package command;

public interface Command {
    public void execute();
    public void undo();
}

package command;

public class Light {

    void lightOn(){
        System.out.println("light on");
    }

    void lightOff(){
        System.out.println("light off");
    }
}

package command;

public class LightOffCommand implements Command{
    Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.lightOff();
    }

    @Override
    public void undo() {
        light.lightOn();
    }
}

package command;

public class LightOnCommand implements Command{
    Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.lightOn();
    }

    @Override
    public void undo() {
        light.lightOff();
    }
}

package command;

public class NoCommand implements Command{
    @Override
    public void execute() {

    }

    @Override
    public void undo() {

    }
}

package command;

public class SimpleRemoteControl {
    Command on;
    Command off;

    public SimpleRemoteControl() {
        this.on=new NoCommand();
        this.off=new NoCommand();
    }

    void setOnSlot(Command command){
        this.on=command;
    }

   public void onButtonWasPressed(){
        on.execute();
   }

    void setOffSlot(Command command){
        this.off=command;
    }

    public void offButtonWasPressed(){
        off.execute();
    }
}

package command;

public class TestCommand {
    public static void test(){
        Light light=new Light();
        LightOnCommand lightOnCommand=new LightOnCommand(light);
        LightOffCommand lightOffCommand=new LightOffCommand(light);
        SimpleRemoteControl simpleRemoteControl=new SimpleRemoteControl();
        simpleRemoteControl.setOnSlot(lightOnCommand);
        simpleRemoteControl.onButtonWasPressed();

        simpleRemoteControl.setOffSlot(lightOffCommand);
        simpleRemoteControl.offButtonWasPressed();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读