定义
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理者链进行发送。收到请求后,每个处理者都可以处理请求或将其传递给链中的下一个处理者。这一模式简化了对象之间的相互连接,使得多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合。
责任链模式的关键要素:
- 处理请求的接口:定义处理请求的接口或抽象类。
- 具体处理者:实现上述接口的具体类,可以处理请求,也可以选择将请求传递给链中的下一个处理者。
- 责任链:管理处理者的链结构,可以决定请求的传递路径。
示例代码
public interface Handler {
/**
* 设置下个处理器
*
* @param nextHandler 下个处理器
*/
void setNextHandler(Handler nextHandler);
/**
* 处理
*
* @param days 天数
* @return 成功还是失败
*/
boolean handler(int days);
}
public class FirstHandler implements Handler {
private static final int ALLOW_MAX_DAYS = 3;
private Handler next;
@Override
public void setNextHandler(Handler nextHandler) {
this.next = nextHandler;
}
@Override
public boolean handler(int days) {
if (days <= ALLOW_MAX_DAYS) {
System.out.println("组长审批");
return true;
}
System.out.println("审核天数大于3天,组长无权限审核");
System.out.println("转下一个人审核");
return next.handler(days);
}
}
public class SecondHandler implements Handler {
private static final int ALLOW_MAX_DAYS = 7;
private Handler next;
@Override
public void setNextHandler(Handler nextHandler) {
this.next = nextHandler;
}
@Override
public boolean handler(int days) {
if (days <= ALLOW_MAX_DAYS) {
System.out.println("部门经理审批");
return true;
}
System.out.println("审核天数大于7天,部门经理无权限审核");
System.out.println("转下一个人审核");
return this.next.handler(days);
}
}
public class ThirdHandler implements Handler {
private static final int ALLOW_MAX_DAYS = 15;
private Handler next;
@Override
public void setNextHandler(Handler nextHandler) {
this.next = nextHandler;
}
@Override
public boolean handler(int days) {
if (days <= ALLOW_MAX_DAYS) {
System.out.println("总经理审核");
return true;
}
System.out.println("审核天数大于15天,总经理无权限审核");
System.out.println("转下一个人审核");
return this.next.handler(days);
}
}
public class ChainTest {
@Test
public void test() {
FirstHandler firstHandler = new FirstHandler();
SecondHandler secondHandler = new SecondHandler();
ThirdHandler thirdHandler = new ThirdHandler();
firstHandler.setNextHandler(secondHandler);
secondHandler.setNextHandler(thirdHandler);
firstHandler.handler(15);
}
}
运行结果
审核天数大于3天,组长无权限审核
转下一个人审核
审核天数大于7天,部门经理无权限审核
转下一个人审核
总经理审核
示例源码地址
https://gitee.com/youxiaxiaomage/java-practices/tree/master/yxxmg-gof-sample/src/main/java/com/yxxmg/gof/behavior/chain