设计模式-责任链模式

本文介绍了设计模式中的责任链模式,通过公司请假流程举例,展示了如何在多个处理者间动态分配请求处理,降低了耦合并提高了灵活性。在实际应用中,责任链模式能够动态增删处理者,但可能导致请求未被处理且可能影响系统性能。
摘要由CSDN通过智能技术生成

设计模式-责任链模式

定义:也叫职责链模式,为请求创建了一个接受者对象的链,使多个接受者都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些接受者连成一条链,并沿着这条链传递该请求,不保证一定有接受者处理该请求。

使用场景
(1) 多个对象可以处理一个请求,但是具体哪个对象处理请求在运行时确定
(2) 可动态指定一组对象处理请求,或者添加新的处理者
(3) 需要在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求

责任链模式类图如下
在这里插入图片描述
Handler 抽象处理者角色
定义一个处理请求的接口,包含抽象处理方法和一个后继处理者

ConcreteHandler 具体处理者角色
实现抽象处理者的处理方法,判断能否处理本次请求,如果可以则处理该请求,并将请求转给它的后继者

Client 客户类
创建处理链,并向链头的处理者提交请求,它不关心处理细节和请求的传递过程。

实例如下
公司的请假流程,员工请假需要不同的上级以及上上级的审批,以一个普通员工的请假为例。
(1) 员工发起请假审批(不超过3天),部门主管进行审批,然后主管再转交给 人事经理审批,两者都通过则请假审批通过。
(2) 员工发起请假审批(想请10天),部门主管进行审批,然后主管再转交给 人事经理审批,人事经理审批后再转交给 CEO 审批。三者都通过则请假审批通过。

代码实现如下
Handler 抽象处理者角色

    // 抽象处理者
    public abstract class Handler
    {
        protected Handler nextHandler;

        public void SetNext(Handler handler)
        {
            nextHandler = handler;
        }

        // 请假审批
        public abstract void LevelRequest(string reason, int days);
    }

ConcreteHandler 具体处理者角色

    // 部门主管:具体处理者
    public class DepartmentManager : Handler
    {
        // 请假审批
        public override void LevelRequest(string reason, int days)
        {
            Console.WriteLine("请假原因:" + reason + "  天数:" + days + "  部门主管审批通过");
            // 传递给下一个处理者
            if (null != nextHandler)
            {
                nextHandler.LevelRequest(reason, days);
            }
        }
    }

    // 人事:具体处理者
    public class HR : Handler
    {
        // 请假审批
        public override void LevelRequest(string reason, int days)
        {
            Console.WriteLine("请假原因:" + reason + "  天数:" + days + "  HR 审核通过");
            // 超过 3填的需要转给下一个(CEO)处理
            if (days > 3 && null != nextHandler)
            {
                nextHandler.LevelRequest(reason, days);
            }
        }
    }

    // CEO:具体处理者
    public class CEO : Handler
    {
        public override void LevelRequest(string reason, int days)
        {
            Console.WriteLine("请假原因:" + reason + "  天数:" + days + "  CEO 审核通过 \n\n");
        }
    }

Client 客户类

    public class Client
    {
        public Client()
        {
            // 创建处理者
            DepartmentManager departmentManager = new DepartmentManager();
            HR hR = new HR();
            CEO cEO = new CEO();

            // 赋值下一个处理者
            departmentManager.SetNext(hR);
            hR.SetNext(cEO);

            // 请10天年假出去放松散心
            departmentManager.LevelRequest("张三请年假出去散心", 10);

            // 想休息一天,请1天假
            departmentManager.LevelRequest("李四想休息一天请假", 1);
        }
    }

运行结果如下
在这里插入图片描述

优点:
(1) 减低耦合:将请求者和接受者解耦
(2) 简化了对象:每个接受者只需要保持一个指向下一个接受者的引用。
(3) 灵活性好:通过改变链内的接受者或者调用次序,允许动态地新增或者删除责任链
(4) 扩展性好:可以根据需求增加新的请求处理类,满足开闭原则

缺点:
(1) 不能保证请求一定被处理:由于一个请求没有明确的接受者,所以不能保证它一定被处理。
(2) 系统性能受影响:对于较长的责任链,请求的处理可能涉及多个处理对象,可能会造成循环调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值