设计模式命令模式

类图

 

源码

Command.java
package com.demo;

public interface Command {
    /**
     * 执行命令
     */
    void execute();

    void redo();
    /**
     * 撤销命令
     */
    void undo();
}

Light.java
package com.demo;

public class Light {

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

    public void off() {
        System.out.println("灯暗了...");
    }
}
LightOffCommand.java
package com.demo;

public class LightOffCommand implements Command {

    private Light light;

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

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

    @Override
    public void undo() {
        light.on();
    }
}
LightOnCommand.java
package com.demo;

public class LightOnCommand implements Command {

    private Light light;

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

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

    @Override
    public void undo() {
        light.off();
    }
}
NoCommand.java
package com.demo;

public class NoCommand implements Command {

    @Override
    public void execute() {
        // TODO 自动生成的方法存根

    }
    
    @Override
    public void redo() {
        // TODO 自动生成的方法存根

    }


    @Override
    public void undo() {
        // TODO 自动生成的方法存根

    }

}
RemoteInvoker.java
package com.demo;

public class RemoteInvoker {

    /**
     * 开关命令数组,模拟有很多对开关数组
     */
    private Command[] onCommands;
    private Command[] offCommands;
    /**
     * 撤销(回退)命令
     */
    private Command undoCommand;
    private Command redoCommand;

    public RemoteInvoker(int length) {
        // 有几组开关,就设置多少数组
        onCommands = new Command[length];
        offCommands = new Command[length];
        // 把每个命令初始化成空命令,避免空指针异常
        Command noCommand = new NoCommand();
        undoCommand = noCommand;
        redoCommand = noCommand;
        for (int i = 0; i < length; i++) {
            onCommands[i] = noCommand;
            offCommands[i] = noCommand;
        }
    }


    public void setCommond(int slot, Command onCommand, Command offCommand) {
        onCommands[slot] = onCommand;
        offCommands[slot] = offCommand;
    }


    public void onButton(int slot) {
        onCommands[slot].execute();
        //为撤销(回退)按钮记录动作
        undoCommand = onCommands[slot];
        redoCommand = onCommands[slot];
    }

    public void offButton(int slot) {
        offCommands[slot].execute();
        //为撤销(回退)按钮记录动作
        undoCommand = offCommands[slot];
        redoCommand = onCommands[slot];
    }

    public void undoButton() {
        undoCommand.undo();
    }


    public void redoButton() {
        // TODO 自动生成的方法存根
        redoCommand.redo();
    }
}

Client.java
package com.demo;

public class Client {

    public static void main(String[] args) {
        // 1、创建接收者
        Light light = new Light();
        // 2、创建命令对象
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);
        // 3、创建一组开关并用命令对象装载它
        RemoteInvoker invoker = new RemoteInvoker(1);
        invoker.setCommond(0, lightOnCommand, lightOffCommand);
        // 4、测试
        invoker.onButton(0);
        invoker.offButton(0);
        System.out.println("撤销命令");
        invoker.undoButton();
        System.out.println("重做命令");
        invoker.redoButton();
      }
}

测试截图

 

原文地址:https://www.cnblogs.com/lx06/p/15688528.html