职责链模式(C++实现)

来源:互联网 发布:剑三 捏脸数据 编辑:程序博客网 时间:2024/05/23 13:41

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

 

当客户提交一个请求时,请求是沿链传递直至有一个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;}


 

 

0 0
原创粉丝点击