设计模式四:命令模式

将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

结构

  • Command类:是一个抽象类/接口,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
  • ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。
  • Client类:最终的客户端调用类。
  • Invoker类:调用者,负责调用命令。
  • Receiver类:接收者,负责接收命令并且执行命令。

命令模式的本质是对请求进行封装, 每一个命令都是一个操作,请求方和接收方各自独立,请求一方不必知道接收方的接口和实现。

命令模式的关键在于引入了抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联。在最简单的抽象命令类中只包含了一个抽象的execute()方法,每个具体命令类将一个Receiver类型的对象作为一个实例变量进行存储,从而具体指定一个请求的接收者,不同的具体命令类提供了execute()方法的不同实现,并调用不同接收者的请求处理方法 – 摘自:gitbook

类图

代码

抽象命令类:

abstract class Command {  
    public abstract void execute();  
}

调用者:针对抽象命令类编程

class Invoker {  
    private Command command;  

    //构造注入  
    public Invoker(Command command) {  
        this.command = command;  
    }  

    //设值注入  
    public void setCommand(Command command) {  
        this.command = command;  
    }  

    //业务方法,用于调用命令类的execute()方法  
    public void call() {  
        command.execute();  
    }  
}

具体命令类:

class ConcreteCommand extends Command {  
    private Receiver receiver; //维持一个对请求接收者对象的引用  

    public void execute() {  
        receiver.action(); //调用请求接收者的业务处理方法action()  
    }  
}

接收者:

class Receiver {  
    public void action() {  
        //具体操作  
    }  
}

总结

  1. 命令模式是一种对象行为型模式,将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
  2. 命令模式有缺点,会出现大量具体命令类。
CONTENTS