職責鏈模式(ChainOfResponsibility):使多個對象都有機會處理請求,從而避免請求的寄件者和接收者之間的耦合關係。將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
職責鏈的好處:
當客戶提交一個請求時,請求時沿鏈傳遞直至有一個ConcreteHandler對象負責處理它。
使得接收者和寄件者都沒有對方的明確資訊且鏈中的對象自己也並不知道鏈的結構。結果是職責鏈可簡化對象的相互連結,它們僅需保持一個指向其後繼者的引用,而不需保持它所有的候選接受者的引用。
用戶端:
[code]//Clientint main(){ Handler *h1 = new ConcreteHandler; Handler *h2 = new ConcreteHandler2; Handler *h3 = new ConcreteHandler3; //設定職責鏈上家與下家 h1->setSuccessor(h2); h2->setSuccessor(h3); //請求 int request[8] = {2, 5, 14, 22, 18, 3, 23, 20}; //迴圈給最小處理者提交請求,不同的數額由不同許可權處理者處理 for(auto i = 0; i < 8; ++i){ h1->HandleRequest(request[i]); } // Output: // Handler request // Handler request // Handler2 request // Handler3 request // Handler2 request // Handler request // Handler3 request // Handler3 request return 0;}
類實現:
[code]//Handler處理類class Handler{protected: Handler *successor;public: //設定繼任者 void setSuccessor(Handler *successor){ this->successor = successor; } //處理請求的抽象方法 virtual void HandleRequest(int request){}};//具體處理類,處理它們負責的請求,可訪問的後繼者,如果可以處理該請求,就處理之,否則就將該請求轉寄給它的後繼者class ConcreteHandler: public Handler{public: virtual void HandleRequest(int request)override{ //0~10在此處理 if(request >= 0 && request < 10){ std::cout << "Handler request\n"; }else if(successor != NULL) //否則轉移到下一位 successor->HandleRequest(request); }};class ConcreteHandler2: public Handler{public: virtual void HandleRequest(int request)override{ //10~20在此處理 if(request >= 10 && request < 20){ std::cout << "Handler2 request\n"; }else if(successor != NULL) //否則轉移到下一位 successor->HandleRequest(request); }};class ConcreteHandler3: public Handler{public: virtual void HandleRequest(int request)override{ //20~30在此處理 if(request >= 20 && request < 30){ std::cout << "Handler3 request\n"; }else if(successor != NULL) //否則轉移到下一位 successor->HandleRequest(request); }};
以上就是C++設計模式淺識職責鏈模式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!