命令模式
1、定义
命令模式:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作
2、命令模式结构
- Command(抽象命令类):一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作
- ConcreteCommand(具体命令类):是抽象命令类的子类,实现了抽象类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中,在实现execute()时将调用接收者对象的相关操作
- Invoker(调用者):请求发送者,通过命令对象来执行请求
- Receiver(接收者):执行与请求相关的操作,具体实现对请求的业务处理
3、示例代码
Command
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}
ConcreteCommand
public class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.receive();
}
}
Invoker
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
}
Receiver
public class Receiver {
public void receive() {
System.out.println("This is Receive class!");
}
}
Test
public class Client {
public static void main(String[] args) {
Receiver rec = new Receiver();
Command cmd = new ConcreteCommand(rec);
Invoker i = new Invoker();
i.setCommand(cmd);
i.execute();
}
}
输出
This is Receive class!
4、命令模式的优缺点
优点:
- 降低系统耦合度
- 新的命令可以很容易加入到系统中
- 可以比较容易的设计一个命令队列或组合命令
- 为请求的撤销和恢复操作提供了一种设计和实现方案
缺点:
- 可能会导致系统有过多的具体命令类。
5、命令模式适用环境
- 抽象出待执行的动作以参数化某个对象
- 在不同的时刻指定排列和执行请求
- 支持取消操作
- 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍
- 用构建在原语操作上的高层抽象操作构造一个系统