JAVA设计模式之命令模式

196 阅读1分钟

本文介绍23种设计模式之命令模式。

定义

命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

描述

  • 模式名称:COMMAND(命令)
  • 类型:对象行为型模式
  • 意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
  • 适用性:
    • 抽象出待执行的动作以参数化某对象。
  • 效果:
  • 优点:
    • 将调用操作的对象与知道如何实现该操作的对象解耦。
    • 可扩展性强。
  • 缺点:
    • 可能会导致某些系统有过多的具体命令类,增加系统的复杂性。

类图

1629800380(1).png

  1. Client:客户端复制创建一个ConcreteCommand,并设置接收者和调用者。
  2. Invoker:调用者持有命令对象,并且调用命令对象的excute方法。
  3. Command:所有命令的接口,包含excute()方法和undo()
  4. ConcreteCommand:具体命令类,定义了操作和接收者之间的关系。
  5. Receiver:接收者,就是命令操作的对象。

实现代码

Invoker

public class Invoker {
    private List<Command> commands;

    public Invoker() {
        commands = new ArrayList<>();
    }

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

    public void excute(){
        System.out.println("执行所有命令");
        commands.forEach(command -> {
            command.excute();
        });
    }
}

Command

public interface Command {

    void excute();

    void undo();
}

ConcreteCommand

public class ConcreteCommand implements Command {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }


    @Override
    public void excute() {
        receiver.action();
    }

    @Override
    public void undo() {
        receiver.off();
    }
}

Receiver

public class Receiver {

    public void action(){
        System.out.println("调用receiver的action方法");
    }

    public void off(){
        System.out.println("调用receiver的off方法");
    }
}