责任链设计模式
请假天数 < 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、责任链太长会影响性能