1. 程式人生 > 其它 >設計模式--責任鏈模式

設計模式--責任鏈模式

技術標籤:# 設計模式設計模式

責任鏈設計模式:

// 定義抽象的處理者
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);