//责任链模式
#include <string.h>
class Request
{
private:
int day;
string reason;
public:
Request(int day, string reason)
{
this->day = day;
this->reason = reason;
}
int getday()
{
return day;
}
string getreason()
{
return reason;
}
}; //接下来看下请求相应者,他们有两个核心方法,一个是相应操作,一个是选择继任者。
class Boss
{
private:
string name;
protected:
Boss *successor;
public:
Boss(string name)
{
this->name = name;
}
virtual void SetBosssuccessor(Boss * successor)
{
this->successor=successor;
}
virtual bool PassRequest(Request request)=0;
};
class PM:public Boss
{
public:
PM(string name): Boss(name) {}
public:
bool PassRequest(Request request)
{
int day = request.getday();
// string reason = request.getreason();
if (day <= 0.5)
{
return true;
}
return successor->PassRequest(request);
}
};
class HR:public Boss
{
public:
HR(string name):Boss(name){ }
bool PassRequest(Request request)
{
int day = request.getday();
// string reason = request.getreason();
if (day > 0.5&&day<=2)
{
return true;
}
if(successor)
return successor->PassRequest(request);
return false;
}
};
class Manager :public Boss
{
public:
Manager(string name): Boss(name){ }
bool PassRequest(Request request)
{
int day = request.getday();
string reason = request.getreason();
if (!reason.compare("正当理由"))
{
return true;
}
return false;
}
};
//定义一个处理请求的接口,它可以维护一个后继者连接
typedef enum kind
{
HELP,
PRINT
}KIND;
class HelpHandler {
friend class Request;
public:
HelpHandler(){}
void SetSuccessor(HelpHandler *succ)
{
successor=succ;
}
virtual ~HelpHandler()
{
if(successor)
delete successor;
}
virtual void HandleHelp(Request *theRequest);
virtual void HandleRequest(Request *theRequest);
private:
HelpHandler * successor;
};
void HelpHandler::HandleHelp(Request *theRequest)//每个在链上的对象一致的处理请求和链上访问后继者的接口
{
if(successor){
successor->HandleHelp(theRequest);
}
}
void HelpHandler::HandlePrint(Request *theRequest)
{
if(successor){
successor->HandlePrint(theRequest);
}
}
void HelpHandler::HandleRequest(Request *theRequest)
{
switch(theRequest->GetKind())
{
case HELP:
HandleHelp((HandleHelp*)theRequest);
break;
case PRINT:
HandlePrint((HandlePrint *)theRequest);
break;
default:
break;
}
}
class Request{
public:
kind GetKind()
{
return k;
}
kind k;
Request(kind Kind):k(Kind){}
};
class HandleHelp: public Request {
HandleHelp(kind Kind):Request(Kind){}
};
class HandlePrint: public Request{
HandlePrint(kind Kind):Request(Kind){}
};