设计模式 -- 命令模式

53 阅读2分钟

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

基本介绍

1)命令模式,在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接受者即可,此时,可以使用命令模式来进行设计

2)命令模式使得请求发送者与请求接受者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦

3)在命名模式中,会将一个请求封装成为一个对象,以便使用不同参数来表示不同的请求,同时命名模式也支持可撤销的操作。

4)通俗易懂的理解:将军发布命令,士兵去执行,其中有几个角色:将军(命令发布者)、士兵(命令的具体执行者)、命令(连接将军和士兵)

命令模式的注意事项和细节

1)将发起请求的对象与执行请求的对象解耦。发起请求的对象是调用者,调用者只要调用命令对象的execute()方法就可以让接受者工作,而不必指导具体的接收者对象是谁,是如何实现的,命令对象会负责让接受者执行请求的动作,也就是说,“请求发起者”和“请求执行者”之间的解耦是通过命令对象实现的,命令对象起到了纽带桥梁的作用。

2)容易涉及一个命令队列,只要把命令对象放到列队,就可以多线程的执行命令

3)容易实现对请求的撤销和重做

4)命令模式不足:可能导致某些系统有过多的具体命令类,增加了系统的复杂度,这点在使用的时候要注意

5)空命令也是一种设计模式,他为我们省去了判空的操作。

6)命令模式经典的场景:界面的一个按钮都是一条命令, 模拟CMD订单的撤销/恢复、触发-反馈机制

类图

1.png

示例代码

package com.example.demo.design.command;

public class ConcreteCommand extends Command{


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

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

package com.example.demo.design.command;

public abstract class Command {

    protected Receiver receiver;

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

    abstract public void execute();

}

package com.example.demo.design.command;

public class Invoker {

    private Command command;

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

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

package com.example.demo.design.command;

public class Receiver {

    public void action(){
        System.out.println("执行命令");
    }
}

package com.example.demo.design.command;

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();
    }
}

结果

2.png