一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
- 通过名字中有链可以了解到这个是个链表,只不过这个链表加了自身的逻辑处理。责任链中数据的处理是根据当前的逻辑判断和后继逻辑的判断组成的。
责任链的一些的一些特点
- 链上的每个节点都有执行的可能,都可能终结数据流转。
- 每个业务节点都有独立的业务逻辑处理,对于节点的处理逻辑是解耦的。
- 可以作为数据的过滤,也可以作为数据的传递处理。
结构
- 抽象的处理类 定义一个抽象处理方法,和后继的处理类
- 实际的处理类,实现当前的处理逻辑
- 传递处理的对象
- 客户类组装处理类,不必关系处理的实现逻辑
一个简单的处理流程过滤例子
- 首先声明一个数据传递类
public class ReimburseMoney {
private BigDecimal money;
private String msg;
}
- 声明一个抽象的处理类
处理类这里定义一个抽象方法,可用于实现自身的业务逻辑
定义了一个自动执行下一个链的方法,判断逻辑为是否通过下一个执行;再实现抽象方法的时候如果不想再被下一个链处理了可以设置下个链为null。
public abstract class Handler {
private Handler next;
//业务处理
public abstract boolean approval(ReimburseMoney re);
//处理方法
public boolean approvalHandler(ReimburseMoney re) {
boolean result=this.approval(re);
if(result && null!=next) {
re.setMsg("下级审批中...");
System.out.println(re.toString());
return next.approvalHandler(re);
}else {
return result;
}
}
}
- 实际的处理类
public class GroupLeaderHandler extends Handler {
@Override
public boolean approval(ReimburseMoney re) {
if(re.getMoney().compareTo(new BigDecimal(10))<=0) {
re.setMsg("L1小额无需审批");
System.out.println(re.toString());
this.setNext(null);//无需下级审批
return true;
}else if(re.getMoney().compareTo(new BigDecimal(10000))<=0){
re.setMsg("L1审批通过");
System.out.println(re.toString());
return true;
}else {
re.setMsg("L1审批失败");
return false;
}
}
}
客户端组装类,效果
用到的地方
- Servlet开发中,过滤器(Filter 一般做登录判断)是链式处理
- Java中,异常捕获也是一种责任链模式
- 过滤数据根据不同维度组合进行数据过滤,相当于筛选条件