[23种设计模式][行为型]04.命令模式

77 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第N天,点击查看活动详情

1.意图:

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 在面向对象编程的范畴中,命令模式(英语:Command pattern)是一种设计模式,它尝试以对象来代表实际行动。命令对象可以把行动(action) 及其参数封装起来,于是这些行动可以被:

  • 重复多次
  • 取消(如果该对象有实现的话)
  • 取消后又再重做

2.命令(Command)模式的构成:

  1. 客户角色:创建一个具体命令对象,并确定其接收者
  2. 命令角色:声明一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个接口或抽象类实现
  3. 具体命令角色:定义一个接收者和行为之间的若耦合,实现execute方法,负责调用接收者的相应操作
  4. 请求者角色:负责调用命令对象执行请求
  5. 接收者角色:负责具体实施和执行一个请求

3.命令模式UML图:

Image.png

4.命令模式序列图:

Image.png

5.代码示例:

Image.png

客户角色:

public class Client {

    public static void main(String[] args) {

        Receiver receiver = new Receiver();

        Command command = new ConcreteCommand(receiver);

        Invoker invoker = new Invoker();

        invoker.setCommand(command);
        invoker.executeCommand();   // 执行相应的命令
    }
}

命令角色:

public abstract class Command {

    protected Receiver receiver;

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

    public abstract void execute();
}

抽象命令角色:

public class ConcreteCommand extends Command {

    public ConcreteCommand(Receiver receiver) {
        super(receiver);
    }

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

请求者角色:

public class Invoker {

    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void executeCommand() {
        this.command.execute();
    }
}

接受者角色:

public class Receiver {

    public void action() {
        System.out.println("Receiver executed");
    }
}