-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCommand-Pattern
114 lines (96 loc) · 2.73 KB
/
Command-Pattern
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
1.命令模式
定义:命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或者交易(Transaction)模式。
将请求封装成对象,可以使你用不同请求,队列,或日志请求来参数化其他对象,命令模式也可以支持撤销操作,
原则:依赖抽象,不依赖具体类
优点:
.命令模式使新的命令很容易被加入到系统里。
.能较容易的设计一个命令队列。
.可以容易的实现对请求的撤销和恢复。
.在需要的情况下,可以较容易的将命令记入日志
缺点:
.使用命令模式可能会导致某些系统有过多的具体命令类
实现:
客户端角色(Client):创建一个具体命令ConcreteCommand对象并确定其接收者。
命令角色(Command): 声明一个给所有具体命令类的抽象接口。
具体命令角色(ConcreteCommand):定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
请求者角色(Invoker):负责调用命令对象执行请求,相关的方法叫做行动方法。
接收者角色(Receiver):负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。
#include <iostream>
using namespace std;
class Receiver
{
/**
* 真正执行命令相应的操作
*/
public :
void action()
{
std::cout<<"excute action..."<<endl;
}
};
class Command
{
public:
/**
* 执行方法
*/
virtual void execute() = 0;
};
class ConcreteCommand :public Command
{
/**
* 持有相应的接收者对象
*/
private :
Receiver *receiver = nullptr;
/**
* 构造方法
* @param receiver
*/
public :
ConcreteCommand(Receiver *receiver)
{
this->receiver = receiver;
}
void execute() override
{
//通常会转调接收者的形影方法,让接收者来真正执行功能
receiver->action();
}
};
class Invoker
{
/**
* 持有命令对象
*/
private:
Command * command = nullptr;
/**
* 构造方法
* @param command
*/
public:
Invoker(Command *command)
{
this->command = command;
}
/**
* 行动方法
*/
void action()
{
command->execute();
}
};
int main()
{
//创建接收者
Receiver *receiver = new Receiver();
//创建命令对象,设定其接收者
Command *command = new ConcreteCommand(receiver);
//创建请求者,把命令对象设置进去
Invoker *invoker = new Invoker(command);
//执行方法
invoker->action();
return 0;
}