-
职责链模式:一种行为型设计模式
-
应用场景:
系统中会出现一些请求,而可以处理请求的处理者会有很多,如何将由适当的处理者处理请求,是职责链模式解决的问题。
职责链模式将所有处理者连成一条链,请求在链上传播,直至被处理完成。
举例:
在公司的请假系统中,一般会分为n级审核人。一级审核人是组长,可以批准24小时以下请假申请;二级审核人是部门主管,可以批准48小时以下请假申请;而48小时以上的申请则需要由三级审核人,部门经理批准。
使用职责链模式将一二三级审核人连成一条链,申请由一级审核人开始审核,如果一级审核人不能批准则传给二级审核人、三级审核人。 -
实现方式:
创建一个审核者抽象类,类中只封装一个共同的处理请求纯虚函数。
一级审核人类中添加二级审核人作为成员变量,并在构造时初始化。处理请求函数中判断申请属性,如果不能处理,交给二级审核人审核。
二级审核人类中同上。
以下是职责链模式的简单代码实现
#include <iostream>
using namespace std;
//假期请求类
class HolidayRequest
{
public:
HolidayRequest(int iHour):m_iHour(iHour){}
int GetHour(){return m_iHour;}
private:
int m_iHour;//请求的假期时间
};
//审批者抽象类
class Approver
{
public:
virtual bool DealRequest(HolidayRequest*) = 0;
};
//一级审批者,可审批24小时以下假期申请
class FirstLevelApprover : public Approver
{
public:
FirstLevelApprover(Approver* pApprover):m_pApprover(pApprover){}
virtual bool DealRequest(HolidayRequest* pReq)
{
if(pReq->GetHour() < 24)
{
cout << "First Level Approved" << endl;
return true;
}
return m_pApprover->DealRequest(pReq);
}
private:
Approver* m_pApprover;
};
//二级审批者,可审批48小时以下假期申请
class SecondLevelApprover : public Approver
{
public:
SecondLevelApprover(Approver* pApprover):m_pApprover(pApprover){}
virtual bool DealRequest(HolidayRequest* pReq)
{
if(pReq->GetHour() < 48)
{
cout << "Second Level Approved" << endl;
return true;
}
return m_pApprover->DealRequest(pReq);
}
private:
Approver* m_pApprover;
};
//一级审批者,审批48小时以上假期申请
class ThirdLevelApprover : public Approver
{
public:
virtual bool DealRequest(HolidayRequest* pReq)
{
cout << "Third Level Approved" << endl;
return true;
}
};
主函数中的使用
int main()
{
ThirdLevelApprover* pThird = new ThirdLevelApprover();
SecondLevelApprover* pSecond = new SecondLevelApprover(pThird);
FirstLevelApprover* pFirst = new FirstLevelApprover(pSecond);
cout << "=====18-Hours Request=====" << endl;
HolidayRequest* pReq1 = new HolidayRequest(18);
pFirst->DealRequest(pReq1);
cout << "=====36-Hours Request=====" << endl;
HolidayRequest* pReq2 = new HolidayRequest(36);
pFirst->DealRequest(pReq2);
cout << "=====72-Hours Request=====" << endl;
HolidayRequest* pReq3 = new HolidayRequest(72);
pFirst->DealRequest(pReq3);
return 0;
}
控制台输出结果
=====18-Hours Request=====
First Level Approved
=====36-Hours Request=====
Second Level Approved
=====72-Hours Request=====
Third Level Approved
如有错误,欢迎指正
网友评论