责任链设计模式

模拟学生请假流程,用以说明责任链模式。

        请假天数 < 10,老师审批;

        10 <= 请假天数 < 20,主任审批;

        20 <= 请假天数 < 30,校长审批;

        请假天数 >= 30,超出学校允许请假范围。

项目结构:

责任链设计模式_第1张图片

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、责任链太长会影响性能

你可能感兴趣的:(设计模式)