-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommand-pattern.ts
143 lines (114 loc) · 2.89 KB
/
command-pattern.ts
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**
* What is the Command Design Pattern?
*
* - The command pattern is a behavioural design pattern in which an object is
* used to represent and encapsulate all the information needed to call
* a method at a later time
* - This information includes the method name, the object that owns the method
* and values for the method parameters
* - Allows you to store lists of code that is used at a later time
* or many times
* - Client says "I want a specific Command to run when execute() is called on
* one of these encapsulated(hidden) Objects"
* - An Object called the Invoker transfers this Command to another Object
* called a Receiver to execute the right code
*
* @see http://www.newthinktank.com/2012/09/command-design-pattern-tutorial/
*/
interface ElectronicDevice {
on(): void;
off(): void;
volumeUp(): void;
volumeDown(): void;
}
class Television implements ElectronicDevice {
private volume: number = 0;
on(): void {
console.log("TV is ON");
}
off(): void {
console.log("TV is OFF");
}
volumeUp(): void {
this.volume++;
this.displayVolume();
}
volumeDown(): void {
this.volume--;
this.displayVolume();
}
private displayVolume() {
console.log(`TV Volume is at ${this.volume}`);
}
}
interface Command {
execute(): void;
}
class TurnTVOn implements Command {
private device: ElectronicDevice;
public constructor(device: ElectronicDevice) {
this.device = device;
}
execute(): void {
this.device.on();
}
}
class TurnTVOff implements Command {
private device: ElectronicDevice;
public constructor(device: ElectronicDevice) {
this.device = device;
}
execute(): void {
this.device.off();
}
}
class TurnTVUp implements Command {
private device: ElectronicDevice;
public constructor(device: ElectronicDevice) {
this.device = device;
}
execute(): void {
this.device.volumeUp();
}
}
class TurnTVDown implements Command {
private device: ElectronicDevice;
public constructor(device: ElectronicDevice) {
this.device = device;
}
execute(): void {
this.device.volumeDown();
}
}
class DeviceButton {
private command: Command;
public constructor(command: Command) {
this.command = command;
}
public press(): void {
this.command.execute();
}
}
class TVRemote {
public static getDevice(): ElectronicDevice {
return new Television();
}
}
//------------------------------------------------------------------------------
const device = TVRemote.getDevice();
const commands = {
on: new TurnTVOn(device),
off: new TurnTVOff(device),
up: new TurnTVUp(device),
down: new TurnTVDown(device),
};
const buttons = {
on: new DeviceButton(commands.on),
off: new DeviceButton(commands.off),
up: new DeviceButton(commands.up),
down: new DeviceButton(commands.down),
};
buttons.off.press();
buttons.on.press();
buttons.up.press();
buttons.down.press();