设计模式之命令模式

命令模式(Command Pattern):将一个请求封装为一个对象,从而可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作,属于行为型模式。

命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。

组成

命令模式由抽象命令 AbstractCommand、具体命令 ConcreteCommand、调用者 Invoker 和接收者 Receiver 组成。

其中 AbstractCommand 用于声明执行操作的接口;ConcreteCommand 持有接收者对象,通过调用接收者来实现执行操作的接口;Invoker 触发命令的执行;Receiver 负责实际执行请求的相关操作。

优点

降低行为请求者和实现者间的耦合。

可以比较容易地设计一个命令队列。

方便将命令记入日志。

可与在接收请求时否决请求。

容易实现对请求的撤销和重做。

新的命令不影响其他类,可以很容易地加入到系统中。

缺点

可能会导致系统中存在过多的具体命令类。

使用场景

需要将行为请求者和实现者解耦,或需要支持命令的排队、撤销、重做时可以使用命令模式。

设计原则

遵循开闭原则、单一职责原则和最小知识原则(迪米特法则)。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class Receiver {
public void action() {
System.out.println("action");
}
}

public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}

public class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}

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

public class Invoker {
private List<Command> commands = new ArrayList<>();
public void addCommand(Command command) {
commands.add(command);
}

public void executeCommands() {
commands.forEach(Command::execute);
}
}

public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Invoker invoker = new Invoker();

Command command1 = new ConcreteCommand(receiver);
invoker.addCommand(command1);

Command command2 = new ConcreteCommand(receiver);
invoker.addCommand(command2);

Command command3 = new ConcreteCommand(receiver);
invoker.addCommand(command3);

invoker.executeCommands();
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2016-2020 姜越

谢谢老板

支付宝
微信