職責鏈模式:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。其思想很簡單,考慮員工要求加薪。公司的管理者一共有三級,總經理、總監、經理,如果一個員工要求加薪,應該向主管的經理申請,如果加薪的數量在經理的職權內,那麼經理可以直接批准,否則將申請上交給總監。總監的處理方式也一樣,總經理可以處理所有請求。這就是典型的職責鏈模式,請求的處理形成了一條鏈,直到有一個對象處理請求。給出這個例子的UML圖。
代碼的實現比較簡單,如下所示:
- //抽象管理者
- class Manager
- {
- protected:
- Manager *m_manager;
- string m_name;
- public:
- Manager(Manager *manager, string name):m_manager(manager), m_name(name){}
- virtual void DealWithRequest(string name, int num) {}
- };
- //經理
- class CommonManager: public Manager
- {
- public:
- CommonManager(Manager *manager, string name):Manager(manager,name) {}
- void DealWithRequest(string name, int num)
- {
- if(num < 500) //經理職權之內
- {
- cout<<"經理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
- }
- else
- {
- cout<<"經理"<<m_name<<"無法處理,交由總監處理"<<endl;
- m_manager->DealWithRequest(name, num);
- }
- }
- };
- //總監
- class Majordomo: public Manager
- {
- public:
- Majordomo(Manager *manager, string name):Manager(manager,name) {}
- void DealWithRequest(string name, int num)
- {
- if(num < 1000) //總監職權之內
- {
- cout<<"總監"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
- }
- else
- {
- cout<<"總監"<<m_name<<"無法處理,交由總經理處理"<<endl;
- m_manager->DealWithRequest(name, num);
- }
- }
- };
- //總經理
- class GeneralManager: public Manager
- {
- public:
- GeneralManager(Manager *manager, string name):Manager(manager,name) {}
- void DealWithRequest(string name, int num) //總經理可以處理所有請求
- {
- cout<<"總經理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
- }
- };
- //抽象管理者
- class Manager
- {
- protected:
- Manager *m_manager;
- string m_name;
- public:
- Manager(Manager *manager, string name):m_manager(manager), m_name(name){}
- virtual void DealWithRequest(string name, int num) {}
- };
- //經理
- class CommonManager: public Manager
- {
- public:
- CommonManager(Manager *manager, string name):Manager(manager,name) {}
- void DealWithRequest(string name, int num)
- {
- if(num < 500) //經理職權之內
- {
- cout<<"經理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
- }
- else
- {
- cout<<"經理"<<m_name<<"無法處理,交由總監處理"<<endl;
- m_manager->DealWithRequest(name, num);
- }
- }
- };
- //總監
- class Majordomo: public Manager
- {
- public:
- Majordomo(Manager *manager, string name):Manager(manager,name) {}
- void DealWithRequest(string name, int num)
- {
- if(num < 1000) //總監職權之內
- {
- cout<<"總監"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
- }
- else
- {
- cout<<"總監"<<m_name<<"無法處理,交由總經理處理"<<endl;
- m_manager->DealWithRequest(name, num);
- }
- }
- };
- //總經理
- class GeneralManager: public Manager
- {
- public:
- GeneralManager(Manager *manager, string name):Manager(manager,name) {}
- void DealWithRequest(string name, int num) //總經理可以處理所有請求
- {
- cout<<"總經理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;
- }
- };
客戶調用方式爲:
- //測試案例
- int main()
- {
- Manager *general = new GeneralManager(NULL, "A"); //設置上級,總經理沒有上級
- Manager *majordomo = new Majordomo(general, "B"); //設置上級
- Manager *common = new CommonManager(majordomo, "C"); //設置上級
- common->DealWithRequest("D",300); //員工D要求加薪
- common->DealWithRequest("E", 600);
- common->DealWithRequest("F", 1000);
- delete common; delete majordomo; delete general;
- return 0;
- }
- //測試案例
- int main()
- {
- Manager *general = new GeneralManager(NULL, "A"); //設置上級,總經理沒有上級
- Manager *majordomo = new Majordomo(general, "B"); //設置上級
- Manager *common = new CommonManager(majordomo, "C"); //設置上級
- common->DealWithRequest("D",300); //員工D要求加薪
- common->DealWithRequest("E", 600);
- common->DealWithRequest("F", 1000);
- delete common; delete majordomo; delete general;
- return 0;
- }
本人享有博客文章的版權,轉載請標明出處 http://blog.csdn.net/wuzhekai1985