软件体系结构-命令模式

定义

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

UML类图

四个部分:

  • 抽象命令类Command
  • 具体命令类ConcreteCommand
  • 调用者Invoker
  • 接收者Receiver

代码

抽象命令类

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

具体命令类

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

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

调用者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Invoker{
private Command command;

public Invoker(Command command){
this.command = command;
}

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

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

接收者

1
2
3
4
5
public class Receiver{
public void action(){
具体操作
}
}

优点

  • 降低系统的耦合度,新的命令可以很容易地加入到系统中,符合开闭原则
  • 比较容易设计命令队列和宏命令
  • 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案

缺点

  • 使用命令模式可能会导致某些系统有过多的具体命令类

适用

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互
  • 系统需要在不同的时间指定请求、将请求排队和执行请求
  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作
  • 系统需要将一组操作组合在一起形成宏命令