模拟学生请假流程,用以说明责任链模式。
请假天数 < 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、责任链太长会影响性能