6、命令模式

命令模式定义:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。
  • 命令模式将发出请求的对象(RemoteControl遥控器类)和执行请求的对象(点灯类)解耦;
  • 在被解耦的对象之间通过Command对象进行沟通(例如LightCommand封装Light类的开灯与关灯命令);
  • 调用者通过调用命令execute()发出请求,execute()调用实际的执行者;
  • 调用者可以接收命令参数,甚至在运行时动态的进行(动态把命令绑定到调用者遥控器上,并且调用者遥控器是针对接口编程);
  • 命令可以支持undo撤销操作,在调用者(遥控器)上可以记录上一个执行的命令,调用undo撤销上一个命令即可;
  • 命令模式可以实现日志与队列系统:
日志系统:可以将执行的每个命令记录到日志系统中,当系统崩溃或者死机后,可以根据日志系统的命令在重新执行一遍,对系统进行还原;
队列系统:工作队列,把实际的工作对象与调用者进行解耦,例如:线程池等;
 
定义命令接口:用于规范每个命令需要实现的方法
public interface Command {
    void execute();
    void undo();
}
定义 灯类:灯下包括打开 与 关闭 两个命令。
public class Light {
    private String name;

    public Light(String name) {
        this.name = name;
    }

    public void on(){
        System.out.println("开灯");
    }

    public void off(){
        System.out.println("关灯");
    }
}
定义灯命令类:用于封装灯的开灯 与关灯 命令。
public class LightCommand implements Command {
    private Light light;

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

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

    @Override
    public void undo(){
        light.off();
    }
}
定义NoCommand命令,针对遥控器上没有命令的数字按键。
public class NoCommand implements Command {

    public NoCommand(){

    }

    @Override
    public void execute(){
        System.out.println("没有打开命令");
    }

    @Override
    public void undo(){
        System.out.println("没有关闭命令");
    }
}
定义遥控器类:
定义存放命令的数组;
针对用户的打开与关闭两个命令;
public class RemoteControl {
    Command[] commands;

    public RemoteControl() {
        commands = new Command[10];
        for(int i=0;i<10;i++) {
            commands[i] = new NoCommand();
        }
    }
    public void setCommands(int slot,Command onCommand) {
        commands[slot] = onCommand;
    }
    public void onButton(int slot) {
        commands[slot].execute();
    }
    public void offButton(int slot) {
        commands[slot].undo();
    }
}
测试类:
public class Test {
    public static void main(String[] args) {
        Light light = new Light("电灯");
        LightCommand lightCommand = new LightCommand(light);
        RemoteControl control = new RemoteControl();
        control.setCommands(0,lightCommand);
        control.onButton(0);
        control.offButton(0);
        control.onButton(1);
        control.offButton(1);
    }
}
执行结果:
开灯
关灯
没有打开命令
没有关闭命令

猜你喜欢

转载自www.cnblogs.com/use-D/p/9749093.html