> 文章列表 > 责任链设计模式

责任链设计模式

责任链设计模式

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

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

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

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

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

项目结构:

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

public class Director extends Leader {public Director(String name) {super(name);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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、责任链太长会影响性能

隐翅虫网