Command Pattern 对象行为型模式
意图
将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作
结构
其中:
- Command 声明执行操作的接口
- ConcreteCommand 将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现 Execute
- Client 创建一个具体命令对象并设定它的接收者
- Invoker 要求该命令执行这个请求
- Receiver 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者
适用性
Command 模式适用于:
- 抽象出待执行的动作以参数化某对象
- 在不同的时刻指定、排列和执行请求
- 支持取消操作
- 支持修改日志
- 用构建在原语操作上的高层操作构造一个系统
例子
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class CommandPattern {
public static void main(String[] args) {
// 接收者 对象 电视机
Tv tv = new Tv();
// 命令对象
Command oncommand = new OnCommand(tv);
Command offcommand = new OffCommand(tv);
// 请求者
Invoker invoker = new Invoker();
// 开机
invoker.setCommand(oncommand);
invoker.Execute();
// 关机
invoker.setCommand(offcommand);
invoker.Execute();
}
}
class Invoker{ // 请求者
private Command command; // 命令
public void setCommand(Command command){ // 设置请求者 的 请求的命令
this.command = command;
}
public void Execute(){ // 执行命令
command.Execute();
}
}
interface Command{ // 命令接口
public void Execute(); // 执行命令
}
class OnCommand implements Command{ // 开机命令
private Tv tv;
public OnCommand(Tv tv){
this.tv = tv;
}
@Override
public void Execute(){
tv.OnAction();
}
}
class OffCommand implements Command{ // 关机命令
private Tv tv;
public OffCommand(Tv tv){
this.tv = tv;
}
@Override
public void Execute(){
tv.OffAction();
}
}
class Tv{ // 接收者 电视机
public void OnAction(){
System.out.println("Tv On");
}
public void OffAction(){
System.out.println("Tv Off");
}
}