前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >行为型之责任链模式C++实现

行为型之责任链模式C++实现

作者头像
用户9831583
发布2022-06-16 15:44:13
2110
发布2022-06-16 15:44:13
举报
文章被收录于专栏:码出名企路

现实需求:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。

责任链模式:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

主要角色:

  1. 抽象处理者角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  2. 具体处理者角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  3. 客户类角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

案例:

小码路上学的时候经常请假,请假的天数也越来越多,这时候班主任不耐烦了,我管不你了,你去找院长吧。用责任链模式设计一个请假条审批模块。分析:假如规定学生请假小于或等于 2 天,班主任可以批准;小于或等于 7 天,系主任可以批准;小于或等于 10 天,院长可以批准;其他情况不予批准。

第一步:抽象处理类

代码语言:javascript
复制
#pragma once
#include <iostream>
using namespace std;

//抽象处理者:领导类
class Leader
{
    public:
        void setNext(Leader *next)
        {
            this->next=next;
        }
        Leader* getNext()
        {
            return next;
        }
        //处理请求的方法
        virtual void handleRequest(int Days)=0;

    private:
        Leader *next;
};

第二步:具体处理类

代码语言:javascript
复制
//具体处理者:班主任
class ClassLeader:public Leader
{
    public:
        void handleRequest(int Days)
        {
            if(Days <=2)
            {
                cout<<"班主任批准您请假: "<<Days<<" 天"<<endl;
            }
            else
            {  
                if(getNext()!=NULL)
                {
                    getNext()->handleRequest(Days);
                }
                else
                {
                     cout<<"请假天数太多,去找系主任吧!"<<endl;
                }
            }
        }
};

//具体处理者:班主任
class DepartmentLeader:public Leader
{
    public:
        void handleRequest(int Days)
        {
            if(Days <=7)
            {
                cout<<"系主任批准您请假: "<<Days<<" 天"<<endl;
            }
            else
            {  
                if(getNext()!=NULL)
                {
                    getNext()->handleRequest(Days);
                }
                else
                {
                     cout<<"请假天数太多,去找院长吧!"<<endl;
                }
            }
        }
};


//具体处理者:院长
class DeanLeader:public Leader
{
    public:
        void handleRequest(int Days)
        {
            if(Days <=10)
            {
                cout<<"院长批准您请假: "<<Days<<" 天"<<endl;
            }
            else
            {  
                if(getNext()!=NULL)
                {
                    getNext()->handleRequest(Days);
                }
                else
                {
                     cout<<"请假天数太多,直接退学吧!"<<endl;
                }
            }
        }
};

第三步:客户端责任链

代码语言:javascript
复制
#include "z.h"

int main()
{
    //组装责任连
    Leader *t1=new ClassLeader();
    Leader *t2=new DepartmentLeader();
    Leader *t3=new DeanLeader();

    t1->setNext(t2);
    t2->setNext(t3);

    //提交请求
    t1->handleRequest(2);
    t1->handleRequest(8);
    t1->handleRequest(18);
}

显示:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档