【设计模式】责任链模式

  |   0 评论   |   43 浏览

简介

由一个命令对象源和一系列处理对象组成,每个处理对象都包含定义其可以处理的命令对象类型的逻辑,其余的传递给链中的下一个处理对象,还有一种机制用于将新的处理对象添加到这个链的末尾,责任链相当于是if…elseif…elseif…else…endif,他的好处就是可以在运行时改变执行顺序,对系统更加松散耦合,该模式属于行为型。
职责链模式在结构上与装饰器模式几乎相同,不同之处在于,对于装饰器,所有类都处理请求,而对于责任链,链中的一个类恰好处理请求。

适用场景

1、一个请求的处理需要多个对象当中的一个或多个协作处理

优点

1、请求的发送者和接收者解耦
直接在发送请求的类中实现请求是不灵活的,因为它将类耦合到特定的接收方,使得不可能支持多个接收方。
2、责任链可以动态组合
这允许将请求发送到一个接收链,而不需要知道哪个接收链处理请求,请求沿着链传递,直到接收方处理请求,请求的发送方不再耦合到特定的接收方。

缺点

1、责任链太长或者处理时间过长,影响性能
2、责任链有可能过多

代码示例

image.png
员工类

public class Staff {
    public String name;
    /**
     * 请假天数
     */
    public Integer leaveDays;
    public Staff() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getLeaveDays() {
        return leaveDays;
    }
    public void setLeaveDays(Integer leaveDays) {
        this.leaveDays = leaveDays;
    }
}

审批抽象类,这里需要把自己作为变量,并进行设值。

public abstract class Approve {
    protected Approve approve;
    public void setNextApprove(Approve approve){
        this.approve = approve;
    }
    public abstract void pass(Staff staff);
}

部门审批类

public class DepartmentHeadApprove extends Approve {
    @Override
    public void pass(Staff staff) {
        if(null != staff.getLeaveDays()){
            //请假天数不为空,进入审批流程
            System.out.println(staff.getName()+"的请假,部门领导批准了");
            if(staff.getLeaveDays()>2 && null != approve){
                //请假天数大于2天,需要更高级别的人审批
                approve.pass(staff);
            }
        }else{
            System.out.println(staff.getName()+"找死逗我玩呢");
        }
    }
}

CEO类

public class CEOApprove extends Approve {
    @Override
    public void pass(Staff staff) {
        if(staff.getLeaveDays()>2){
            System.out.println(staff.getName()+"的请假,ceo批准了");
            if(null != approve){
                approve.pass(staff);
            }
        }else{
            System.out.println(staff.getName()+"找死逗我玩呢");
        }
    }
}

测试类

public class ChainTest {
    public static void main(String[] args) {
        Staff staff = new Staff();
        staff.setName("李四");
        staff.setLeaveDays(3);
        Approve departmentHeadApprove = new DepartmentHeadApprove();
        CEOApprove ceoApprove = new CEOApprove();
        departmentHeadApprove.setNextApprove(ceoApprove);
        departmentHeadApprove.pass(staff);
    }
}

上面示例源码

源码分析

servlet中应用

Filter过滤器,
image.png
FilterChain过滤器链路
image.png
MockFilterChainFilterChain的实现类
image.png
LoggerContextFilterFilter的实现类
image.png

也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论