Spring中的责任链模式

什么是责任链模式

今天我们来看看设计模式中责任链模式是如何使用的。首先看看它的定义:使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间具有高度的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。一句话总结就是,以一定的流程处理某个对象,直至这个流程链被遍历完

责任链角色

主要涉及到的角色主要包括:

  1. 抽象处理者角色:处理请求的抽象类,定义了处理请求的抽象方法;(抽象类或接口实现);
  2. 具体处理者角色:处理请求的具体实现类;(持有下家对象的引用);

责任链模式的结构其实与链表很相似,区别就是责任链模式中的所有对象都有一个共同的父类或者接口。在责任链模式中,N个处理器子类都处理同一个请求,只不过各个处理器的处理职责有所差别。

示例代码实现

这里我们以请假这样一个流程来学习下如何使用责任链模式。一般请假流程都是先由本部门审核,根据时间长短再进行下一级审批,因此用这个例子来讲解责任链再合适不过了。

package com.hjh.design;

/**
 * @author hjh
 * 抽象处理者角色
 */
public abstract class AskForLeaveHandler {
    /**
     * 请假天数
     */
    public int maxday;
    /**
     * 请假人
     */
    public String name;

    public AskForLeaveHandler(String name, int maxday) {
        this.maxday = maxday;
        this.name = name;
    }

    private AskForLeaveHandler nextHandler;

    public void setNextHandler(AskForLeaveHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    /**
     * 处理请假:判断请假天数,超过本部门限定时间则交由上一级部门
     */

    public final void handlingFakeSlips(int day) {
        if (this.maxday >= day) {
            this.agree(day);
        }
        else {
            if (nextHandler != null) {
                System.out.println(name+":天数已超过我的审批权限,已提交我的上级审批");
                nextHandler.handlingFakeSlips(day);
            }
            else {
                System.out.println("天数时间过长,准备辞职吧!!!");
            }
        }
    }

    /**
     * 审批动作:子类来实现
     * @param day
     */
    abstract void agree(int day);

}
package com.hjh.design;

/**
 * @author hjh
 * 研发部门审批
 */
public class RDDepartment extends AskForLeaveHandler {

    public RDDepartment(String name, int maxday) {
        super(name, maxday);
    }

    @Override
    void agree(int maxday) {
        System.out.println(name + ":研发部门请假审批通过,请假天数:" + maxday);
    }

}
package com.hjh.design;

/**
 * @author hjh
 * 项目主管
 */
public class Supervisor extends AskForLeaveHandler{
    public Supervisor(String name, int maxday) {
        super(name, maxday);
    }

    @Override
    void agree(int maxday) {
        System.out.println(name + ":主管请假审批通过,请假天数:" + maxday);
    }
}

package com.hjh.design;

/**
 * @author hjh
 * 董事审批
 */
public class Director extends AskForLeaveHandler{
    public Director(String name, int maxday) {
        super(name, maxday);
    }

    @Override
    void agree(int maxday) {
        System.out.println(name + ":请假董事审批通过,请假天数:" + maxday);
    }
}
package com.hjh.design;

/**
 * @author hjh
 * 职工
 */
public class Staff {
    public static void main(String[] args) {
        RDDepartment rdDepartment = new RDDepartment("研发部门",5);
        Supervisor supervisor = new Supervisor("项目主管",30);
        Director director = new Director("董事",180);
        rdDepartment.setNextHandler(supervisor);
        supervisor.setNextHandler(director);
        rdDepartment.handlingFakeSlips(36);
    }
}
运行结果

运行结果

责任链模式的优缺点

  • 优点
    • 请求者与接收者解耦
    • 可以动态地增加或减少责任链上的对象,或者修改对象
  • 缺点
    • 调用者不知道请求可能被哪些责任链对象处理,不利于排错
    • 用户请求可能被责任链中途拦截,最终未必被真正执行

一般来说,责任链模式经常使用在过滤器,拦截器等处理场景中,比较熟悉的就是Servlet 中的过滤器 Filter 就是典型的责任链模式。

欢迎大家添加个人公众号,一起进步努力。
个人公众号

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值