职责链模式(Chain of Responsibility)
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
加薪代码实现
#include <iostream>
using namespace std;
#define SAFE_DELETE(p) {if(p){delete p; p = nullptr;}}
//申请
class Request {
private:
string requestType;
string requestContent;
int requestNumber = 0;
public:
void SetRequestType(string requestType){
this->requestType = requestType;
}
string GetRequestType() {
return this->requestType;
}
void SetRequestContent(string requestContent) {
this->requestContent = requestContent;
}
string GetRequestContent() {
return this->requestContent;
}
void SetRequestNumber(int requestNumber) {
this->requestNumber = requestNumber;
}
int GetRequestNumber() {
return this->requestNumber;
}
};
//抽象管理者
class Manager {
protected:
string name;
Manager* superior = nullptr;
public:
Manager(string name) {
this->name = name;
}
//设置管理者的上级
virtual void SetSuperior(Manager* superior) {
this->superior = superior;
}
//申请请求
virtual void RequestApplications(Request* request) {}
};
//经理
class CommonManager :public Manager {
public:
CommonManager(string name):Manager(name){}
void RequestApplications(Request* request) {
if (request->GetRequestType() == "请假" && request->GetRequestNumber() <= 2) {
cout << name << ":" << request->GetRequestContent() << " " << request->GetRequestNumber() << " 被批准" << endl;
}
else {
if (superior != nullptr) {
superior->RequestApplications(request);
}
}
}
};
//总监
class Majordomo :public Manager {
public:
Majordomo(string name) :Manager(name) {}
void RequestApplications(Request* request) {
if (request->GetRequestType() == "请假" && request->GetRequestNumber() <= 5) {
cout << name << ":" << request->GetRequestContent() << " " << request->GetRequestNumber() << " 被批准" << endl;
}
else {
if (superior != nullptr) {
superior->RequestApplications(request);
}
}
}
};
//总经理
class GeneralManager :public Manager {
public:
GeneralManager(string name) :Manager(name) {}
void RequestApplications(Request* request) {
if (request->GetRequestType() == "请假") {
cout << name << ":" << request->GetRequestContent() << " " << request->GetRequestNumber() << " 被批准" << endl;
}
else if (request->GetRequestType() == "加薪" && request->GetRequestNumber() <= 500) {
cout << name << ":" << request->GetRequestContent() << " " << request->GetRequestNumber() << " 被批准" << endl;
}
else if (request->GetRequestType() == "加薪" && request->GetRequestNumber() > 500) {
cout << name << ":" << request->GetRequestContent() << " " << request->GetRequestNumber() << " 再说吧" << endl;
}
}
};
//客户端
void test01() {
CommonManager* jingli = new CommonManager("经理");
Majordomo* zongjian = new Majordomo("总监");
GeneralManager* zongjingli = new GeneralManager("总经理");
jingli->SetSuperior(zongjian);
zongjian->SetSuperior(zongjingli);
Request* request1 = new Request();
request1->SetRequestType("请假");
request1->SetRequestContent("小菜请假");
request1->SetRequestNumber(1);
jingli->RequestApplications(request1); //注意 申请都是由“经理”发出的
Request* request2 = new Request();
request2->SetRequestType("请假");
request2->SetRequestContent("小菜请假");
request2->SetRequestNumber(4);
jingli->RequestApplications(request2); //注意 申请都是由“经理”发出的
Request* request3 = new Request();
request3->SetRequestType("加薪");
request3->SetRequestContent("小菜请求加薪");
request3->SetRequestNumber(900);
jingli->RequestApplications(request3); //注意 申请都是由“经理”发出的
SAFE_DELETE(request3);
SAFE_DELETE(request2);
SAFE_DELETE(request1);
SAFE_DELETE(zongjingli);
SAFE_DELETE(zongjian);
SAFE_DELETE(jingli);
}
int main() {
test01();
return 0;
}