职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandle对象负责处理它。职责链可以简化对象之间的互相连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用。
#include <iostream>
#include <string>
using namespace std;
class Request
{
private:
string requestType;
string requestContent;
int number;
public:
void SetRequestType( string type )
{
requestType = type;
}
string GetRequestType()
{
return requestType;
}
void SetRequestContent( string content )
{
requestContent = content;
}
string GetRequestContent()
{
return requestContent;
}
void SetNumber( int number )
{
this->number = number;
}
int GetNumber()
{
return number;
}
};
class Manager
{
protected:
string name;
Manager* superior;
public:
Manager( string name )
{
this->name = name;
}
void SetSuperior( Manager* superior )
{
this->superior = superior;
}
virtual void RequestApplications( Request& request ) = 0;
};
class CommonManager : public Manager
{
public:
CommonManager( string name ) : Manager(name)
{}
void RequestApplications( Request& request )
{
if( request.GetRequestType() == "请假" && request.GetNumber() <= 2 )
{
cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 被批准"<<endl;
}
else
{
if( superior != NULL )
superior->RequestApplications( request );
}
}
};
class Majordomo : public Manager
{
public:
Majordomo( string name ) : Manager(name)
{}
void RequestApplications( Request& request )
{
if( request.GetRequestType() == "请假" && request.GetNumber() <= 5 )
{
cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 被批准"<<endl;
}
else
{
if( superior != NULL )
{
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.GetNumber()<<" 被批准"<<endl;
}
else if( request.GetRequestType() == "加薪" && request.GetNumber() <= 500 )
{
cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 被批准"<<endl;
}
else if( request.GetRequestType() == "加薪" && request.GetNumber() > 500 )
{
cout<<name<<":"<<request.GetRequestContent()<<" 数量"<<request.GetNumber()<<" 再说吧"<<endl;
}
}
};
int main()
{
CommonManager jinli("金利");
Majordomo zongjian("宗剑");
GeneralManager zhongjingli("钟精励");
jinli.SetSuperior( &zongjian );
zongjian.SetSuperior( &zhongjingli );
Request request;
request.SetRequestType("请假");
request.SetRequestContent("小菜请假");
request.SetNumber( 1 );
jinli.RequestApplications( request );
Request request2;
request2.SetRequestType("请假");
request2.SetRequestContent("小菜请假");
request2.SetNumber( 4 );
jinli.RequestApplications( request2 );
Request request3;
request3.SetRequestType("加薪");
request3.SetRequestContent("小菜请求加薪");
request3.SetNumber( 500 );
jinli.RequestApplications( request3 );
Request request4;
request4.SetRequestType("加薪");
request4.SetRequestContent("小菜请求加薪");
request4.SetNumber( 1000 );
jinli.RequestApplications( request4 );
return 0;
}