命令模式

请求发送者和请求接受者实现解耦,在命令模式中,会将一个请求封装成一个对象,以便使用不同的参数来表示不同的请求,同时命令模式也支持撤销的操作

命令模式的结构

顾名思义,命令模式就是对命令的封装,首先看下命令模式类图中的基本结构:

command类:是一个抽象类,抽象类在代码中好处在于增加了灵活性

所谓对命令的封装,说白了,无非就是把一系列的操作写到一个方法中,然后供客户端调用就行了

代码

package command;

public class Client {
    public static void main(String[] args){
        Receiver receiver = new Receiver();
        /*接受者的目的在于命令者给指令后接受者做很多事,所有需要他*/
        Command command = new ConcreteCommand(receiver);
        /*具体的命令传参数为什么是接受者,因为接受者是中间缓冲层,必须放在中间
        * 当然自己也可以反过来,但这里不需要*/
        //客户端直接执行具体命令方式(此方式与类图相符)
        command.execute();

        //客户端通过调用者来执行命令
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        invoker.action();
        /*把命令的调用者和执行者分开,使得双方不必关心对方是如何操作的,
        * 或者说吧一个命令的执行分为三步
        * 执行的流程为调用者类,命令类,接受者类*/
    }
}
package command;
/*调用者,负责调用命令*/

/*抽象类*/
abstract class Command {
    /*对需要执行的命令进行申明*/
    public abstract void execute();
}
/*具体实现类,实现抽象类中方法*/
class ConcreteCommand extends Command {
    /*接受者放在这里。接受者接收到的具体需求*/
    private Receiver receiver;
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }
    public void execute() {
        this.receiver.doSomething();
    }
}
/*接收者,负责接收命令并且执行命令*/
class Receiver {
    public void doSomething(){
        System.out.println("做一些其他的事");
        System.out.println("接受者-业务逻辑处理");
    }
}
class Invoker {
    /*所有里面要聚合command接口,设置哪个command,以及用到command中的方法
     * 这里负责调用命令的意思是写上自己的方法,实则调用command的方法,实现参数可变
     * 可以用各种command,这里参数写接口很多好处,写了接口,具体传可以是实现类
     * 这是一种多态的表现。更加灵活*/
    private Command command;
    public void setCommand(Command command) {
        this.command = command;
    }
    public void action(){
        this.command.execute();
    }
}
/*将一个请求封装成一个对象,从而让你使用不同的请求吧客户端参数化,对请求排队或者
* 记录请求日志,可以提供命令的撤销和恢复*/

合理选择命令模式

优点:封装性好,扩展性好

缺点:如果命令很多,开发起来就会很头疼

总结

基于敏捷开发而言,不确定必须用命令模式,我们只需要把请求的响应操作封装到一个方法中,这个封装的方法可以成为命令,但是不是命令模式,到底要不要上升到模式的高度就要另行考虑。