【设计模式】加薪非要老总批 --- 职责链模式
生活随笔
收集整理的這篇文章主要介紹了
【设计模式】加薪非要老总批 --- 职责链模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一,概述
??????? 定義:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為之。
??????? 優點:客戶提出請求時,請求時沿鏈傳遞直至有一個ConcreteHandler對象負責處理它
?
?
二,職責鏈基本代碼
#include <iostream> using namespace std; class Handler {protected:static Handler *successor;public:void SetSuccessor(Handler *successor){this->successor = successor;}virtual void HandleRequest(int request){} }; Handler* Handler::successor=NULL; //必須是static 變量才能在全局初始化 class ConcreteHandler1 :public Handler{public: void HandleRequest(int request){if (request >= 0 && request < 10){cout<<"ConcreteHandler1"<<"處理請求"<<request<<endl;}else if (successor != NULL){successor->HandleRequest(request);}}}; class ConcreteHandler2 :public Handler{public:void HandleRequest(int request){if (request >= 10 && request < 20){cout<<"ConcreteHandler2"<<"處理請求"<<request<<endl;}else if (successor != NULL){successor->HandleRequest(request);}}}; class ConcreteHandler3 :public Handler{public:void HandleRequest(int request){if (request >= 20 && request < 30){cout<<"ConcreteHandler3"<<"處理請求"<<request<<endl;}else if (successor != NULL){successor->HandleRequest(request);}}}; int main() {Handler *h1 = new ConcreteHandler1();Handler *h2 = new ConcreteHandler2();Handler *h3 = new ConcreteHandler3();h1->SetSuccessor(h2);//設置下一個 h2->SetSuccessor(h3);//設置下一個 int request[] = { 2, 5, 14, 22, 18, 3, 27, 20 };for(int i=0;i<8;++i){h1->HandleRequest(request[i]);}return 0; }三,示例
? ? ? ? 小菜要求加薪,而加薪的批準需要總經理來批準。經理交給總監,總監交給總經理。
? ? ? ? ?缺點:Manager 類 太長,分支太多。如果要增加項目經理、部門經理等職位的話,需要更改原類,比較麻煩。
#include <iostream> using namespace std;//enum ManagerLevel{ "經理","總監","總經理"} ManagerLevel; enum ManagerLevel{ manager,chief_inspector,president} ; //申請class Request{//申請類別private:string requestType;public:string getRequestType(){return requestType; }void setRequestType(string value) { requestType = value; }//申請內容private:string requestContent;public:string getRequestContent(){return requestContent; }void setRequestContent(string value) { requestContent = value; }//數量private:int number;public:int getNumber(){return number;}void setNumber(int value){this->number = value; }}; //管理者class Manager{protected:string name;public:Manager(string name){this->name = name;}//得到結果void GetResult(ManagerLevel managerLevel, Request request){if (managerLevel == manager){if (request.getRequestType() == "請假" && request.getNumber() <= 2){//Console.WriteLine("{0}:{1} 數量{2} 被批準", name, request.RequestContent, request.Number);cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; }else{cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"我無權處理"<<endl; //Console.WriteLine("{0}:{1} 數量{2} 我無權處理", name, request.RequestContent, request.Number);}}else if (managerLevel ==chief_inspector){if (request.getRequestType() == "請假" && request.getNumber() <= 5){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; //Console.WriteLine("{0}:{1} 數量{2} 被批準", name, request.RequestContent, request.Number);}else{cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"我無權處理"<<endl; //Console.WriteLine("{0}:{1} 數量{2} 我無權處理", name, request.RequestContent, request.Number);}}else if (managerLevel == president){if (request.getRequestType() == "請假"){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; //Console.WriteLine("{0}:{1} 數量{2} 被批準", name, request.RequestContent, request.Number);}else if (request.getRequestType() == "加薪" && request.getNumber() <= 500){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; // Console.WriteLine("{0}:{1} 數量{2} 被批準", name, request.RequestContent, request.Number);}else if (request.getRequestType() == "加薪" && request.getNumber() > 500){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; // Console.WriteLine("{0}:{1} 數量{2} 再說吧", name, request.RequestContent, request.Number);}}}}; int main(){Manager *jinli = new Manager("金利");Manager *zongjian = new Manager("宗劍");Manager *zhongjingli = new Manager("鐘精勵");Request *request = new Request();request->setRequestType("加薪");request->setRequestContent("小菜請求加薪");request->setNumber(1000);jinli->GetResult(manager, *request);zongjian->GetResult(chief_inspector, *request);zhongjingli->GetResult(president, *request);Request *request2 = new Request();request2->setRequestType("請假");request2->setRequestContent("小菜請假");request2->setNumber(3);jinli->GetResult(manager, *request2);zongjian->GetResult(chief_inspector, *request2);zhongjingli->GetResult(president, *request2);return 0; }? ? ?2)改進后的代碼
? ? ? ? ? ?說明:C++中不可以直接聲明類的對象,但是可以直接聲明類的指針。
#include <iostream> using namespace std;//enum ManagerLevel{ "經理","總監","總經理"} ManagerLevel; enum ManagerLevel{ manager,chief_inspector,president} ; //申請class Request{//申請類別private:string requestType;public:string getRequestType(){return requestType; }void setRequestType(string value) { requestType = value; }//申請內容private:string requestContent;public:string getRequestContent(){return requestContent; }void setRequestContent(string value) { requestContent = value; }//數量private:int number;public:int getNumber(){return number;}void setNumber(int value){this->number = value; }}; //管理者class Manager{protected:string name;//管理者的上級Manager *superior;public:Manager(string name){this->name = name;}//設置管理者的上級void SetSuperior(Manager *superior){this->superior = superior;}//申請請求virtual void RequestApplications(Request request){} }; //經理class CommonManager :public Manager{public:CommonManager(string name): Manager(name){ }void RequestApplications(Request request){if (request.getRequestType() == "請假" && request.getNumber() <= 2){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; }else{if (superior != NULL)superior->RequestApplications(request);}}}; //總監class Majordomo :public Manager{public: Majordomo(string name): Manager(name){ }void RequestApplications(Request request){if (request.getRequestType() == "請假" && request.getNumber() <= 5){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; }else{if (superior != NULL)superior->RequestApplications(request);}}}; //總經理class GeneralManager :public Manager{public:GeneralManager(string name): Manager(name){ }void RequestApplications(Request request){if (request.getRequestType() == "請假"){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; }else if (request.getRequestType() == "加薪" && request.getNumber() <= 500){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"被批準"<<endl; }else if (request.getRequestType() == "加薪" && request.getNumber() > 500){cout<<name<< request.getRequestContent()<<"數量"<< request.getNumber()<<"再說吧"<<endl; }}}; int main(){CommonManager *jinli = new CommonManager("金利");Majordomo *zongjian = new Majordomo("宗劍");GeneralManager *zhongjingli = new GeneralManager("鐘精勵");jinli->SetSuperior(zongjian);zongjian->SetSuperior(zhongjingli);Request *request = new Request();request->setRequestType("請假");request->setRequestContent("小菜請假");request->setNumber(1);jinli->RequestApplications(*request);Request *request2 = new Request();request2->setRequestType("請假");request2->setRequestContent("小菜請假");request2->setNumber(4);jinli->RequestApplications(*request2);Request *request3 = new Request();request3->setRequestType("加薪");request3->setRequestContent("小菜請求加薪");request3->setNumber(500);jinli->RequestApplications(*request3);Request *request4 = new Request();request4->setRequestType("加薪");request4->setRequestContent("小菜請求加薪");request4->setNumber(1000);jinli->RequestApplications(*request4);return 0; }
?
轉載于:https://www.cnblogs.com/secbook/archive/2012/07/18/2654972.html
總結
以上是生活随笔為你收集整理的【设计模式】加薪非要老总批 --- 职责链模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何让网页不缓冲
- 下一篇: 时代亿信 文件共享访问控制网关