模拟学生请假流程,用以说明责任链模式。
请假天数 < 10,老师审批;
10 <= 请假天数 < 20,主任审批;
20 <= 请假天数 < 30,校长审批;
请假天数 >= 30,超出学校允许请假范围。
项目结构:

10 <= 请假天数 < 20,主任审批
public class Director extends Leader {
    public Director(String name) {
        super(name);
    }
    @Override
    public void handleLeaveRequest(LeaveRequest leaveRequest) {
        Integer days = leaveRequest.getDays();
        if (days < 20) {
            System.out.println(this.getName() + "处理了请假。");
        } else {
            this.nextLeader.handleLeaveRequest(leaveRequest);
        }
    }
}20 <= 请假天数 < 30,校长审批
public class HeadMaster extends Leader {
    public HeadMaster(String name) {
        super(name);
    }
    @Override
    public void handleLeaveRequest(LeaveRequest leaveRequest) {
        Integer days = leaveRequest.getDays();
        if (days < 30) {
            System.out.println(this.getName() + "处理了请假。");
        } else {
            System.out.println("请假天数超出学校允许范围。");
        }
    }
}请假天数 < 10,老师审批
public class Teacher extends Leader {
    public Teacher(String name) {
        super(name);
    }
    @Override
    public void handleLeaveRequest(LeaveRequest leaveRequest) {
        Integer days = leaveRequest.getDays();
        if (days < 10) {
            System.out.println(this.getName() + "处理了请假。");
        } else {
            this.nextLeader.handleLeaveRequest(leaveRequest);
        }
    }
}领导角色:
@Data
public abstract class Leader {
    public Leader(String name) {
        this.name = name;
    }
    protected String name;
    /**
     * 建立责任链关系的关键属性:下一个审批领导
     */
    protected Leader nextLeader;
    /**
     * 处理请假
     * @param leaveRequest
     */
    public abstract void handleLeaveRequest(LeaveRequest leaveRequest);
}
请假类:
@Data
public class LeaveRequest {
    private String name;
    private String reason;
    private Integer days;
    public LeaveRequest(String name, String reason, Integer days){
        super();
        this.name = name;
        this.reason = reason;
        this.days = days;
    }
}
测试类:
public class TestMethod {
    public static void main(String[] args) {
        // 请假请求对象
        LeaveRequest leaveRequest = new LeaveRequest("小明", "生病", 30);
        // 创建责任链环节
        Teacher teacher = new Teacher("老师");
        Director director = new Director("主任");
        HeadMaster headMaster = new HeadMaster("校长");
        // 建立责任链关系
        teacher.setNextLeader(director);
        director.setNextLeader(headMaster);
        // 处理请假请求
        teacher.handleLeaveRequest(leaveRequest);
    }
}
总结一下责任链主要适用一下几种情况:
1、多个对象可以处理同一个请求,但是具体由那个对象处理完成则在运行时决定。
2、不明确指定接收者的情况下,向多个对象中的一个提交一个请求
策略模式和责任链模式的区别:
策略模式:
优点:
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。
缺点:
1、策略类会增多。
2、所有策略类都需要对外暴露。
责任链模式优缺点
         优点:
1、请求与处理解耦
2、处理者只需要关心自己的处理逻辑即可,如果不是自己的直接转发
3、具有链式传递功能,请求者不需要关系链路结构等待结果就好
4、易于维护,可以很灵活的修改链路的结构新增或者删除,符合开闭原则
缺点:
1、会出现循环引用的情况
2、责任链太长会影响性能



















