美文网首页程序员设计模式 BY C++C++设计模式
C++ 设计模式 —— 13.职责链模式

C++ 设计模式 —— 13.职责链模式

作者: JeremyYv | 来源:发表于2019-12-13 10:45 被阅读0次
  • 职责链模式:一种行为型设计模式

  • 应用场景:
    系统中会出现一些请求,而可以处理请求的处理者会有很多,如何将由适当的处理者处理请求,是职责链模式解决的问题。
    职责链模式将所有处理者连成一条链,请求在链上传播,直至被处理完成。
    举例:
    在公司的请假系统中,一般会分为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

如有错误,欢迎指正

相关文章

网友评论

    本文标题:C++ 设计模式 —— 13.职责链模式

    本文链接:https://www.haomeiwen.com/subject/kgxfnctx.html