责任链设计模式:
class LeaderHandler{
public:
virtual bool handleRequest(int leave_days, LeaderHandlerChain* chain) = 0;
};
class LeaderHandlerChain{
public:
LeaderHandlerChain& addHandler(LeaderHandler* handler){
handlerList.push_back(handler);
return *this;
}
bool handleRequest(int leave_days);
LeaderHandler* getNextHandler(){
int tmp_index = index + 1;
if(tmp_index >= handlerList.size())
return nullptr;
return handlerList[tmp_index];
}
void setIndexAdd(){
index++;
}
private:
QList<LeaderHandler*> handlerList;
int index;
};
bool LeaderHandlerChain::handleRequest(int leave_days)
{
if(handlerList.size() == 0)
return false;
handlerList[0]->handleRequest(leave_days, this);
}
class ClassAdviser : public LeaderHandler{
public:
ClassAdviser(int days){
this->days = days;
}
virtual bool handleRequest(int leave_days, LeaderHandlerChain* chain){
if(leave_days <= days){
qDebug() << "ClassAdviser handle...";
return true;
}
else
{
LeaderHandler* next = chain->getNextHandler();
if(next == nullptr)
{
qDebug() << "no body handle this msg...";
}
else
{
chain->setIndexAdd();
next->handleRequest(leave_days, chain);
}
}
}
private:
int days;
};
class DepartmemHead : public LeaderHandler{
public:
DepartmemHead(int days){
this->days = days;
}
virtual bool handleRequest(int leave_days, LeaderHandlerChain* chain){
if(leave_days <= days){
qDebug() << "DepartmemHead handle...";
return true;
}
else
{
LeaderHandler* next = chain->getNextHandler();
if(next == nullptr)
{
qDebug() << "no body handle this msg...";
}
else
{
chain->setIndexAdd();
next->handleRequest(leave_days, chain);
}
}
}
private:
int days;
};
class Dean : public LeaderHandler{
public:
Dean(int days){
this->days = days;
}
virtual bool handleRequest(int leave_days, LeaderHandlerChain* chain){
if(leave_days <= days){
qDebug() << "Dean handle...";
return true;
}
else
{
LeaderHandler* next = chain->getNextHandler();
if(next == nullptr)
{
qDebug() << "no body handle this msg...";
}
else
{
chain->setIndexAdd();
next->handleRequest(leave_days, chain);
}
}
}
private:
int days;
};
class DeanOfStudies : public LeaderHandler{
public:
DeanOfStudies(int days){
this->days = days;
}
virtual bool handleRequest(int leave_days, LeaderHandlerChain* chain){
if(leave_days <= days){
qDebug() << "DeanOfStudies handle...";
return true;
}
else
{
LeaderHandler* next = chain->getNextHandler();
if(next == nullptr)
{
qDebug() << "no body handle this msg...";
return false;
}
else
{
chain->setIndexAdd();
next->handleRequest(leave_days, chain);
}
}
}
private:
int days;
};
LeaderHandlerChain chain;
chain.addHandler(new ClassAdviser(3)).addHandler(new DepartmemHead(5)).addHandler(new Dean(7)).addHandler(new DeanOfStudies(10));
chain.handleRequest(11);