美文网首页程序员设计模式 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