使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
#include<iostream>
#include<string>
using namespace std;
//职责链模式
//请求类
class Request{
public:
Request(string requesttype, string requestcontent, int number)
:requestType(requesttype), requestContent(requestcontent), Number(number)
{
;
}
string requestType;
string requestContent;
int Number;
};
//管理类的抽象接口
class Manage{
protected:
string name;
Manage * superior; //上级
public:
Manage(string name){
this->name = name;
superior = 0;
}
void SetSuperior(Manage * superior){
this->superior = superior;
}
virtual void RequestApplications(Request request)=0;
};
//经理
class CommonManager :public Manage{
public:
CommonManager(string name):Manage(name){
}
void RequestApplications(Request request){
if (request.requestType == "请假"&& request.Number <= 2)
{
cout << this->name <<":"<< request.requestContent << "数量" << request.Number<<"被批准"<<endl;
}
else
{
if ( superior!=0 ){
superior->RequestApplications(request);
}
}
}
};
//总监
class Majordomo :public Manage{
public:
Majordomo(string name) :Manage(name){
}
void RequestApplications(Request request){
if (request.requestType == "请假"&& request.Number <= 5)
{
cout << this->name << ":" << request.requestContent << "数量" << request.Number << "被批准" << endl;
}
else
{
if (superior != 0){
superior->RequestApplications(request);
}
}
}
};
//总经理
class GeneralManager :public Manage{
public:
GeneralManager(string name) :Manage(name){
}
void RequestApplications(Request request){
if (request.requestType == "请假")
{
cout << this->name << ":" << request.requestContent << "数量" << request.Number << "被批准" << endl;
}
else if (request.requestType == "加薪" && request.Number<=500)
{
cout << this->name << ":" << request.requestContent << "数量" << request.Number << "被批准" << endl;
}
else if (request.requestType == "加薪" && request.Number > 500){
cout << this->name << ":" << request.requestContent << "数量" << request.Number << "在说吧" << endl;
}
}
};
int main(){
CommonManager jinli("经理");
Majordomo zongjian("总监");
GeneralManager zongjinli("总经理");
jinli.SetSuperior( &zongjian );
zongjian.SetSuperior( &zongjinli );
Request request("请假","小菜请假",1);
jinli.RequestApplications(request);
request.requestType = "请假";
request.requestContent = "小菜请假";
request.Number = 5;
jinli.RequestApplications(request);
request.requestType = "加薪";
request.requestContent = "小菜请求加薪";
request.Number = 500;
jinli.RequestApplications(request);
request.requestType = "加薪";
request.requestContent = "小菜请求加薪";
request.Number = 600;
jinli.RequestApplications(request);
return 0;
}