命令模式

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

命令模式

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
94
95
96
97
98
99
100
101
102
103
// 命令
interface Commmand {
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;

/**
* Context data, required for launching the receiver's methods.
*/
private a: string;

private b: string;

/**
* Complex commands can accept one or several receiver objects along with
* any context data via the constructor.
*/
constructor(receiver: Receiver, a: string, b: string) {
this.receiver = receiver;
this.a = a;
this.b = b;
}

/**
* Commands can delegate to any methods of a receiver.
*/
public execute(): void {
console.log('ComplexCommand: 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;

/**
* Initialize commands.
*/
public setOnStart(command: Command): void {
this.onStart = command;
}

public setOnFinish(command: Command): void {
this.onFinish = command;
}

/**
* The Invoker does not depend on concrete command or receiver classes. The
* Invoker passes a request to a receiver indirectly, by executing a
* 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): object is 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();