设计模式 命令模式

本文将介绍设计模式中的命令模式。

一、什么命令模式?

将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。

命令模式将请求发送者与请求接收者解耦,请求发送者通过命令对象间接引用接收者,使得系统具有更好的灵活性。

二、实现

1. 结构

2. 角色

  • Command 抽象命令类:
    • 抽象类或接口
    • 声明了用于执行请求的 execute() 等方法
  • ConcreteCommand 具体命令类:
    • 抽象命令类的实现类
    • 类中持有对接收者的引用
    • 实现了用于执行请求的 execute() 等方法,会在该方法中调用接收者的相应操作
  • Invoker 调用者:
    • 请求发送者
  • Receiver 接收者:
    • 接收者负责具体实现命令的处理

3. 简单示例

Command:

1
2
3
public abstract class Command {
public abstract void execute();
}

ConcreteCommand:

1
2
3
4
5
6
7
public class ConcreteCommand extends Command {
private Receiver receiver;

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

Invoker:

1
2
3
4
5
6
7
public class Invoker {
privete Command command;

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

Receiver:

1
2
3
4
5
public class Receiver {
public void action() {
...
}
}

三、宏命令

宏命令是组合模式和命令模式结合的产物。

具体来说,

  • 具体命令类中将维护一个集合,集合中的元素均是具体命令类
  • 当调用具体命令类时,它将会执行自身的操作,并调用集合中的具体命令类,从而实现递归调用的效果

四、优缺点

1. 优点

  • 降低耦合度,请求者和接收者之间不存在直接引用
  • 如果希望添加新的命令, 只需要扩展,而不需要修改

2. 缺点

  • 会增加系统中类的数量

参考

  • 《Java 设计模式》