1.责任链概念
允许请求沿着处理者链传递,直到链上的某个处理者决定处理此请求。通过这种方式,请求的发送者无须知道是哪一个接收者处理其请求,这使得系统可以动态地重新组织和分配责任。
2.责任链组成
抽象处理者(Handler): 定义一个处理请求的接口,并持有下一个处理者的引用。
具体处理者(Concrete Handlers): 实现抽象处理者的接口,在处理请求前判断自己是否能够处理该请求,如果可以则进行处理,否则将请求传递给下一个处理者。
客户端(Client): 创建处理者链并将请求发送到链的第一个节点。
3.举个栗子:
以学生请假为例
7天 正常流程:老师(小于2天)==>领导(7天以下)===>校长(所有都行) 结果==》导员批
7天 非正常流程(导员有事): 老师(小于2天)===>校长(所有都行) 结果==》校长批
15天 正常流程:老师(小于2天)==>领导(7天以下)===>校长(所有都行) 结果==》校长批
4.代码实现
1)抽象处理者
package org.xiji.ChainOfResponsibility;
/**
* 抽象处理者
*/
public abstract class Handler {
/**
* 下一个处理者
*/
protected Handler nextHandler;
public Handler setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
return this.nextHandler;
}
/**
* 定义处理方法
*/
public abstract void handle(int day);
}
2)具体处理者
老师
package org.xiji.ChainOfResponsibility;
/**
* 老师
*/
public class Teacher extends Handler{
@Override
public void handle(int day) {
if (day <= 2) {
System.out.println("老师批注请假"+day+"天");
}else {
nextHandler.handle(day);
}
}
}
导员
package org.xiji.ChainOfResponsibility;
/**
* 导员
*/
public class Instructor extends Handler{
@Override
public void handle(int day) {
if (day <= 7) {
System.out.println("导员批注请假"+day+"天");
} else {
nextHandler.handle(day);
}
}
}
校长
package org.xiji.ChainOfResponsibility;
/**
* 校长
*/
public class Principal extends Handler{
@Override
public void handle(int day) {
System.out.println("校长批注请假"+day+"天");
}
}
3)客户端类
package org.xiji.ChainOfResponsibility;
/**
* 处理器测试类
*/
public class ChainOfResponsibilityMain {
public static void main(String[] args) {
//老师角色
Teacher teacher = new Teacher();
//导员角色
Instructor instructor = new Instructor();
//校长角色
Principal principal = new Principal();
System.out.println("===========================");
/**
* 请假关系 老师==>导员===>校长
*/
System.out.println("正常流程请7天假");
teacher.setNextHandler(instructor);
instructor.setNextHandler(principal);
//例如找老师请假七天
int day = 7;
teacher.handle(day);
System.out.println("===========================");
System.out.println("非正常流程请7天假");
//找老师请假七天,导员不在,老师让你找校长
/**
* 请假关系 老师===>校长
*/
teacher.setNextHandler(principal);
teacher.handle(day);
System.out.println("===========================");
System.out.println("正常流程请15天假");
//想请15天假
int day2 = 15;
//正常流程 找老师请假===>导员===>校长
teacher.setNextHandler(instructor);
instructor.setNextHandler(principal);
teacher.handle(day2);
}
}