# 命令模式
将请求转换为一个包含与请求相关的所有信息的独立对象
通俗来讲
# 优点
单一职责原则 可以解耦触发和执行操作的类.
开闭原则 可以在不修改已有客户端代码的情况下在程序中创建新的命令.
可以实现撤销和恢复功能
可以实现操作的延迟执行
可以将一组简单命令组合成一个复杂的命令
# 缺点
- 代码变得更加复杂. 因为在发送者和接收者之间增加了一个全新的层次.
# 适用场景
如果需要通过操作来参数化对象
例如开发一个GUI组件(上下文菜单), 希望用户能够配置菜单项, 并在点击菜单项时触发操作.
如果想要将操作放入队列中, 操作的执行或者远程执行操作
如果想要实现操作回滚功能
# 实现
点击查看代码
interface Command {
execute(): void;
}
class SimpleCommand implements Command {
private payload: string;
constructor(payload: string) {
this.payload = payload;
}
public execute(): void {
console.log(`SimpleCommand: See, I can do simple things like printing (${this.payload})`);
}
}
class ComplexCommand implements Command {
private receiver: Receiver;
private a: string;
private b: string;
constructor(receiver: Receiver, a: string, b: string) {
this.receiver = receiver;
this.a = a;
this.b = b;
}
public execute(): void {
console.log(`ComplexCommandL Complex stuff should be done by a receiver object.`);
this.receiver.doSomething(this.a);
this.receiver.doSomethingElse(this.b);
}
}
class Receiver {
public doSomething(a: string): void {
console.log(`Receiver: Working on (${a})`);
}
public doSomethingElse(b: string): void {
console.log(`Receiver: Also working on (${b})`);
}
}
class Invoker {
private onStart!: Command;
private onFinish!: Command;
public setOnStart(command: Command): void {
this.onStart = command;
}
public setonFinish(command: Command): void {
this.onFinish = command;
}
public doSomethingImportant(): void {
console.log(`Invoker: Does anybody want something done before I begin?`);
if (this.isCommand(this.onStart)) {
this.onStart.execute();
}
console.log(`Invoker: ...doing something really important...`);
console.log(`Invoker: Does anybody want something done after I finish?`);
if (this.isCommand(this.onFinish)) {
this.onFinish.execute();
}
}
private isCommand(object: Command) {
return object.execute !== undefined;
}
}
const invoker = new Invoker();
invoker.setOnStart(new SimpleCommand("Say Hi!"));
const receiver = new Receiver();
invoker.setonFinish(new ComplexCommand(receiver, "Send email", "Save report"));
invoker.doSomethingImportant();
// output:
// Invoker: Does anybody want something done before I begin?
// SimpleCommand: See, I can do simple things like printing (Say Hi!)
// Invoker: ...doing something really important...
// Invoker: Does anybody want something done after I finish?
// ComplexCommand: Complex stuff should be done by a receiver object.
// Receiver: Working on (Send email)
// Receiver: Also working on (Save report)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93