行为型 - 命令模式(Command)

arcstack约 459 字大约 2 分钟

行为型 - 命令模式(Command)

命令模式(Command pattern): 将"请求"封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作。@pdai

意图

将命令封装成对象中,以便使用命令来参数化其它对象,或者将命令对象放入队列中进行排队,或者将命令对象的操作记录到日志中,以及支持可撤销的操作。

类图

  • Command: 命令
  • Receiver: 命令接收者,也就是命令真正的执行者
  • Invoker: 通过它来调用命令
  • Client: 可以设置命令与命令的接收者
ae1b27b8-bc13-42e7-ac12-a2242e125499.png
ae1b27b8-bc13-42e7-ac12-a2242e125499.png

实现

设计一个遥控器,可以控制电灯开关。

e6bded8e-41a0-489a-88a6-638e88ab7666.jpg
e6bded8e-41a0-489a-88a6-638e88ab7666.jpg
    public interface Command {
        void execute();
    }

    public class LightOnCommand implements Command {
        Light light;

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

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

    public class LightOffCommand implements Command {
        Light light;

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

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

    public class Light {

        public void on() {
            System.out.println("Light is on!");
        }

        public void off() {
            System.out.println("Light is off!");
        }
    }

    /** * 遥控器 */
    public class Invoker {
        private Command[] onCommands;
        private Command[] offCommands;
        private final int slotNum = 7;

        public Invoker() {
            this.onCommands = new Command[slotNum];
            this.offCommands = new Command[slotNum];
        }

        public void setOnCommand(Command command, int slot) {
            onCommands[slot] = command;
        }

        public void setOffCommand(Command command, int slot) {
            offCommands[slot] = command;
        }

        public void onButtonWasPushed(int slot) {
            onCommands[slot].execute();
        }

        public void offButtonWasPushed(int slot) {
            offCommands[slot].execute();
        }
    }

    public class Client {
        public static void main(String[] args) {
            Invoker invoker = new Invoker();
            Light light = new Light();
            Command lightOnCommand = new LightOnCommand(light);
            Command lightOffCommand = new LightOffCommand(light);
            invoker.setOnCommand(lightOnCommand, 0);
            invoker.setOffCommand(lightOffCommand, 0);
            invoker.onButtonWasPushed(0);
            invoker.offButtonWasPushed(0);
        }
    }

JDK

上次编辑于:
贡献者: javatodo