随机名言

命令模式

手腕旧伤又疼了,想当键盘侠都难,最近都没有输入输出,颓废了


1. 命令模式(Command Pattern)

请求 封闭成对象,以便使用命令来参数化其它对象,或者将命令对象放入队列中进行排队对行为进行记录、撤销或重做、事务等处理。应用在请求行为和实现者需要解耦的场合,以便撤销等动作


命令模式的组成:

  • Command:封装命令的对象
  • Receiver:命令真正的执行者
  • Invoker:通过它来调用命令
  • Client:可以设置命令与命令的接收者




2. 流程

实现一个基于命令模式的开关灯功能


2.1 Receiver(灯 Light)

public class Light {

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

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


2.2 Command 命令

// 命令接口
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();
    }
}


2.3 Invoker

public class Invoker {
    private List<Command> commands = new LinkedList<>();

    public void receiveCommand(Command command) {
        commands.add(command);
    }

    public void executeCommand() {
        for (Command temp : commands) {
            temp.execute();
        }
        // 这里可以记录命令的执行顺序
        commands.clear();
    }
}


2.4 Client

public class Client {
    public static void main(String[] args) {
        Light light = new Light();
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);
        Invoker invoker = new Invoker();
        invoker.receiveCommand(lightOnCommand);
        invoker.receiveCommand(lightOffCommand);
        invoker.executeCommand();
    }
}

posted @ 2021-09-13 20:44  Howlet  阅读(33)  评论(0编辑  收藏  举报

Copyright © By Howl