-
Notifications
You must be signed in to change notification settings - Fork 0
/
chainOfResponsibility.cpp
125 lines (114 loc) · 3.72 KB
/
chainOfResponsibility.cpp
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
/*职责链模式,使多个对象又机会处理请求,将这个对象连接成一条链,沿着
链处理该请求,知道有对象可以处理为止,和状态模式有点像,状态模式是根据
不太的状态选择不同的处理类,状态模式好像不要求成请求链状
这使得接收者和发送者都没有对方明确的信心。且链中的对象并不知道链的结构
简化了对象的相互连接,仅需要保存一个向后传请求的对象,而不用保存所有
候选的对象。*/
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
class request
{
public:
string requestType;
string requestContent;
int number;
};
class manager
{
protected:
string name;
manager *superior;
public:
manager(string n):name(n),superior(nullptr){};
void setSuperior(manager *sup){superior = sup;};
virtual void requestApplications(request req) = 0;
};
class commonManager : public manager
{
public:
virtual ~commonManager(){};
commonManager(string n):manager(n){};
virtual void requestApplications(request req)
{
if(req.requestType == "请假" && req.number <= 2)
{
cout<<name<<": "<<req.requestContent<<"数量"<<req.number<<"被批准"<<endl;
}
else
{
if(superior)
superior->requestApplications(req);
}
}
};
class majordomo : public manager
{
public:
virtual ~majordomo(){};
majordomo(string n):manager(n){};
virtual void requestApplications(request req)
{
if(req.requestType == "请假" && req.number <= 5)
{
cout<<name<<": "<<req.requestContent<<"数量"<<req.number<<"被批准"<<endl;
}
else
{
if(superior)
superior->requestApplications(req);
}
}
};
class generalManager : public manager
{
public:
virtual ~generalManager(){};
generalManager(string n):manager(n){};
virtual void requestApplications(request req)
{
if(req.requestType == "请假")
{
cout<<name<<": "<<req.requestContent<<"数量"<<req.number<<"被批准"<<endl;
}
else if(req.requestType == "加薪" && req.number <= 500)
{
cout<<name<<": "<<req.requestContent<<"数量"<<req.number<<"被批准"<<endl;
}
else if(req.requestType == "加薪" && req.number > 500)
{
cout<<name<<": "<<req.requestContent<<"数量"<<req.number<<"再说吧"<<endl;
}
}
};
int main()
{
commonManager *jinli = new commonManager("金立");
majordomo *zongjian = new majordomo("总监");
generalManager *zhongjingli = new generalManager("总经理");
jinli->setSuperior(zongjian);
zongjian->setSuperior(zhongjingli);
request req;
req.requestType = "请假";
req.requestContent = "小菜请假";
req.number = 1;
jinli->requestApplications(req);
req.requestType = "请假";
req.requestContent = "小菜请假";
req.number = 4;
jinli->requestApplications(req);
req.requestType = "加薪";
req.requestContent = "小菜加薪";
req.number = 500;
jinli->requestApplications(req);
req.requestType = "加薪";
req.requestContent = "小菜加薪";
req.number = 1000;
jinli->requestApplications(req);
delete zongjian;
delete zhongjingli;
delete jinli;
return 0;
}