职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。其思想很简单,考虑员工请假。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求请假,应该向主管的经理申请,如果请假天数在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。
代码的实现比较简单,如下所示:
头文件
/************************************************* Copyright:FZUIM Author:fzuim Date:20170310 Description:C++设计模式:职责链.h文件 **************************************************/ #ifndef _MANGERMODE_H_ #define _MANGERMODE_H_ #include <iostream> #include <string> using namespace std; //<抽象管理者类 class Manage { public: Manage(string v_szName, Manage* v_pManage); //抽象出,管理者名字和上级管理者 virtual ~Manage(){} public: virtual void DealWithRequest(string v_szName, int v_nNum){} //处理请假请求接口 protected: string m_szName; // 管理者名字 Manage* m_pManage; //管理者的上级 }; //<总经理类 class Boss : public Manage { public: Boss(string v_szName, Manage* v_pManage) : Manage(v_szName, v_pManage){} ~Boss(){} public: void DealWithRequest(string v_szName, int v_nNum); }; //<总监类 class Majordomo : public Manage { public: Majordomo(string v_szName, Manage* v_pManage) : Manage(v_szName, v_pManage){} ~Majordomo(){} public: void DealWithRequest(string v_szName, int v_nNum); }; //<经理类 class Leader : public Manage { public: Leader(string v_szName, Manage* v_pManage) : Manage(v_szName, v_pManage){} ~Leader(){} public: void DealWithRequest(string v_szName, int v_nNum); }; #endifcpp文件
/************************************************* Copyright:FZUIM Author:fzuim Date:20170310 Description:C++设计模式:职责链.cpp文件 **************************************************/ #include "ManagerMode.h" //<管理者类,属性设置 Manage::Manage( string v_szName, Manage* v_pManage ) { m_szName = v_szName; m_pManage = v_pManage; } //<经理处理请假天数3天内的请求 void Leader::DealWithRequest( string v_szName, int v_nNum ) { if(v_nNum < 3) { cout << "Leader:" << m_szName << " approve " << v_szName << " Leave:" << v_nNum << endl; } else { cout << "Leader:" << m_szName <<" Can not be approved, to the superior!" << endl; m_pManage->DealWithRequest(v_szName, v_nNum); } } //<总监类处理请假天数7天内的请求 void Majordomo::DealWithRequest( string v_szName, int v_nNum ) { if(v_nNum < 7) { cout << "Majordomo:" << m_szName << " approve " << v_szName << " Leave:" << v_nNum << endl; } else { cout << "Majordomo:" << m_szName <<" Can not be approved, to the superior!" << endl; m_pManage->DealWithRequest(v_szName, v_nNum); } } //<总经理类处理所有请假请求 void Boss::DealWithRequest( string v_szName, int v_nNum ) { cout << "Boss:" << m_szName << " approve " << v_szName << " Leave:" << v_nNum << endl; } int main() { Manage* pBoss = new Boss("huangdq", NULL); //<总经理,上级设置为NULL Manage* pMajordomo = new Majordomo("lill", pBoss); //<总监,上级设置为总经理 Manage* pLeader = new Leader("lindd", pMajordomo); //<经理,上级设置为总监 pLeader->DealWithRequest("wango", 8); pLeader->DealWithRequest("zhaoxj", 2); pLeader->DealWithRequest("helt", 6); delete pLeader; delete pMajordomo; delete pBoss; system("pause"); return 0; }
