-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathLinary_Command.h
278 lines (246 loc) · 5.23 KB
/
Linary_Command.h
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
/*****************************************************************/
/* 设计模式————命令模式
/* 作者:李凝瑞
/* 时间:2015.06.08
/*****************************************************************/
/** 命令模式:讲一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;
* 对请求排队或者记录日志,以及支持可撤销的操作,是一种对象行为型模式。
*/
#pragma once
#include "stdafx.h"
namespace dp_command {
// 抽象命令类
class Command {
public:
virtual void Execute() = 0;
};
// 请求者
class Invoker {
public:
// 构造注入
Invoker(Command * command) {
this->command = command;
}
// 设置注入
void SetInvoker(Command * command) {
this->command = command;
}
// 调用方法
void Call() {
command->Execute();
}
private:
Command * command;
};
// 接受者(一个具体命令类持有)
class Receiver {
public:
void Action() {
// 执行具体操作
}
};
// 具体命令类
class ConcreteCommand : public Command {
public:
virtual void Execute() {
// 调用接受者的业务处理方法
receiver->Action();
}
private:
// 持有一个接受者
Receiver * receiver;
};
};
namespace linary_command {
// 3个具体接受者
class Opener {
public:
void open() {
std::cout << "打开一个文件" << std::endl;
}
};
class Saver {
public:
void save() {
std::cout << "保存一个文件" << std::endl;
}
};
class Exiter {
public:
void exit() {
std::cout << "关闭一个文件" << std::endl;
}
};
// 抽象命令类
class Command {
public:
Command(const std::string & function) : function(function) {}
virtual void Execute() = 0;
const std::string & GetFunction() const {
return function;
}
protected:
std::string function;
};
// 打开命令
class OpenCommand : public Command {
public:
// 构造函数
OpenCommand() : Command("打开") {
opener = new Opener();
}
// 析构
~OpenCommand() {
delete opener;
}
virtual void Execute() {
opener->open();
}
private:
Opener * opener;
};
// 保存命令
class SaveCommand : public Command {
public:
// 构造函数
SaveCommand() : Command("保存") {
saver = new Saver();
}
// 析构
~SaveCommand() {
delete saver;
}
virtual void Execute() {
saver->save();
}
private:
Saver * saver;
};
// 退出命令
class ExitCommand : public Command {
public:
// 构造函数
ExitCommand() : Command("退出") {
exiter = new Exiter();
}
// 析构
~ExitCommand() {
delete exiter;
}
virtual void Execute() {
exiter->exit();
}
private:
Exiter * exiter;
};
// 按钮类:请求发送者
class Button {
public:
Button(const std::string & label) : label(label) {}
// get/set方法
const std::string & GetLabel() const {
return label;
}
void SetLabel(const std::string & label) {
this->label = label;
}
// 为功能键注入命令
void SetCommand(Command * command) {
this->command = command;
}
// 得到命令描述
const std::string & GetFunction() const {
return command->GetFunction();
}
// 发送请求
void OnClick() {
command->Execute();
}
private:
// 按钮标签
std::string label;
// 维持一个命令对象
Command * command;
};
// 窗口类:不承担任何角色,纯粹是业务环境的需要
class Window {
public:
// 构造
Window(const std::string & title) : title(title) {
for (int i = 0; i < 3; i++) {
std::stringstream ss;
ss << "功能" << i + 1;
buttons[i] = new Button(ss.str());
}
}
// 析构
~Window() {
for (int i = 2; i >= 0 ; --i) {
delete buttons[i];
}
}
// 给指定按钮设置功能键
void SetBtnFunction(int idx, Command * command) {
if (1 <= idx && idx <= 3) {
buttons[idx - 1]->SetCommand(command);
} else {
std::cout << "无效按钮" << std::endl;
}
}
// 点击窗口的按钮
void ClickBtn(int idx) {
std::cout << "点击按钮" << idx << ":";
buttons[idx - 1]->OnClick();
}
// 显示
void Display() {
std::cout << "--------------------------" << std::endl;
std::cout << "显示窗口:" << this->title << std::endl;
std::cout << "功能键:" << std::endl;
std::cout << "--------------------------" << std::endl;
for (int i = 0; i < 3; i++) {
std::cout << buttons[i]->GetLabel() << ":" << buttons[i]->GetFunction() << std::endl;
}
std::cout << "--------------------------" << std::endl;
}
private:
// 窗口标题
std::string title;
// 按钮数组
Button * buttons[3];
};
// 测试代码
static void Test_Command() {
std::cout << "--------------------------" << std::endl;
std::cout << "-- 命令模式测试 --" << std::endl;
std::cout << "--------------------------" << std::endl;
Window * window = new Window("自定义功能键");
Command * openCommand = new OpenCommand();
Command * saveCommand = new SaveCommand();
Command * exitCommand = new ExitCommand();
// 自定义功能键
window->SetBtnFunction(1, openCommand);
window->SetBtnFunction(2, saveCommand);
window->SetBtnFunction(3, exitCommand);
// 显示
window->Display();
// 点击按钮
window->ClickBtn(1);
window->ClickBtn(2);
window->ClickBtn(3);
// 自定义功能键
window->SetBtnFunction(1, saveCommand);
window->SetBtnFunction(2, openCommand);
window->SetBtnFunction(3, exitCommand);
// 显示
window->Display();
window->ClickBtn(1);
window->ClickBtn(2);
window->ClickBtn(3);
delete exitCommand;
delete saveCommand;
delete openCommand;
delete window;
std::cout << std::endl;
}
};