C++设计模式:职责链模式<初探>

来源:互联网 发布:线切割加工费计算软件 编辑:程序博客网 时间:2024/05/24 01:30

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。其思想很简单,考虑员工请假。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求请假,应该向主管的经理申请,如果请假天数在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。

 代码的实现比较简单,如下所示:

头文件

/************************************************* Copyright:FZUIMAuthor:fzuimDate:20170310Description: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);};#endif
cpp文件
/************************************************* Copyright:FZUIMAuthor:fzuimDate:20170310Description: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); //<总经理,上级设置为NULLManage* 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;}


2 0
原创粉丝点击