1. 责任链模式
他使得多个对象都有机会处理请求, 从而避免请求的发送者和接收者之间的耦合关系。他通过将这些对象连成一条链,并沿着这条链来传递请求, 直到有一个对象处理他为止。
但是这个模式要求我们处于后方的对象需要能够处理更多的职责, 需要确保请求传递到了链表末端一定可以被处理。而在每个对象中, 需要确定是自行处理, 还是转移责任。
一般来说链表的越后方, 处理的职责也越大
2. UML图
3. 运行示意图
4. code
request.h
#ifndef _REQUEST_H_
#define _REQUEST_H_
#include <string>
using std::string;
class CRequest{
public:
string RequestType() const { return requestType; }
void RequestType(string val) { requestType = val; }
string RequestContent() const { return requestContent; }
void RequestContent(string val) { requestContent = val; }
int Number() const { return number; }
void Number(int val) { number = val; }
private:
string requestType;
string requestContent;
int number;
};
#endif // _REQUEST_H_
manager.h
#ifndef _MANAGER_H_
#define _MANAGER_H_
#include "request.h"
#include <string>
#include <iostream>
using std::string;
using std::cout;
using std::endl;
class CManager{
public:
CManager(string name) : name(name){}
void SetSuperior(CManager * superior){ this->superior = superior; }
virtual void RequestApplications(CRequest * request) = 0;
protected:
CManager * superior;
string name;
};
class CommonManager : public CManager{
public:
CommonManager(string name) : CManager(name){}
void RequestApplications(CRequest * request){
if (request->RequestType() == "请假" && request->Number() <= 2){
cout << name << " : " << request->RequestContent() << " 数量 " << request->Number() << " 被批准" << endl;
}
else{
if (superior != nullptr)
superior->RequestApplications(request);
}
}
};
class CZongjian : public CManager{
public:
CZongjian(string name) : CManager(name){}
void RequestApplications(CRequest * request){
if (request->RequestType() == "请假" && request->Number() <= 5){
cout << name << " : " << request->RequestContent() << " 数量 " << request->Number() << " 被批准" << endl;
}
else{
if (superior != nullptr)
superior->RequestApplications(request);
}
}
};
class CGeneralManager : public CManager{
public:
CGeneralManager(string name) : CManager(name){}
void RequestApplications(CRequest * request){
if (request->RequestType() == "请假"){
cout << name << " : " << request->RequestContent() << " 数量 " << request->Number() << " 被批准" << endl;
}
else if (request->RequestType() == "加薪" && request->Number() <= 500){
cout << name << " : " << request->RequestContent() << " 数量 " << request->Number() << " 被批准" << endl;
}
else if (request->RequestType() == "加薪" && request->Number() > 500){
cout << name << " : " << request->RequestContent() << " 数量 " << request->Number() << " 不被批准" << endl;
}
}
};
#endif // _MANAGER_H_
main.cpp
#include "manager.h"
#include <iostream>
using namespace std;
int main(){
CManager * jinli = new CommonManager("jinli");
CManager * zongjian = new CZongjian("zongjian");
CManager * zongjingli = new CGeneralManager("zongjingli");
jinli->SetSuperior(zongjian);
zongjian->SetSuperior(zongjingli);
CRequest request;
request.RequestType("请假");
request.RequestContent("小菜请假");
request.Number(7);
jinli->RequestApplications(&request);
system("pause");
return 0;
}