設計模式--責任鏈模式
阿新 • • 發佈:2021-01-31
責任鏈設計模式:
// 定義抽象的處理者
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);
}
// 定義具體的處理者
// 具體處理者1:班主任類
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;
};
//具體處理者2:系主任類
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;
};
//具體處理者3:院長類
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;
};
//具體處理者4:教務處長類
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);