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