【导读】当有问题需要请教时,咨询别人,当其处理不了的时候,就咨询另外一个人,直到有人能处理此问题。这个就是典型的责任链模式。
一、定义
为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
二、实例
比如日常报销流程,一般流程是先填写报销单,然后直系领导审批,通过之后是财务部审批。如果有一层审批不通过,则直接打回。
报销单对象:
代码语言:javascript复制public class ExpenseAccount {
//发票
private String invoice;
//报销单
private String expenseAccount;
public ExpenseAccount(String invoice, String expenseAccount) {
this.invoice = invoice;
this.expenseAccount = expenseAccount;
}
}
抽象审批者:
代码语言:javascript复制public abstract class Approver {
protected Approver approver;
1、设置下一个审批者
public void setNextApprover(Approver approver){
this.approver = approver;
}
2、判断是否有下一个审批人
public boolean hasNextApprover(){
if (null == approver) {
return false;
}
return true;
}
abstract void doApprover(ExpenseAccount expenseAccount);
}
直系领导审批:
代码语言:javascript复制public class DirectLeaderApprover extends Approver {
@Override
public void doApprover(ExpenseAccount expenseAccount) {
if (!StringUtils.isEmpty(expenseAccount.getInvoice())
&& !StringUtils.isEmpty(expenseAccount.getExpenseAccount())) {
System.out.println("直系领导审批通过");
if (hasNextApprover()) {
getNextApprover().doApprover(expenseAccount);
}else {
System.out.println("报销成功,流程结束");
}
} else {
System.out.println("直系领导审批不通过,流程结束");
}
}
}
财务部审批:
代码语言:javascript复制public class AccountingApprover extends Approver {
@Override
public void doApprover(ExpenseAccount expenseAccount) {
if (!StringUtils.isEmpty(expenseAccount.getInvoice()) && !StringUtils.isEmpty(expenseAccount.getExpenseAccount())) {
System.out.println("财务部审批通过");
if (hasNextApprover()) {
getNextApprover().doApprover(expenseAccount);
}else {
System.out.println("报销成功,流程结束");
}
} else {
System.out.println("财务部审批不通过,流程结束");
}
}
}
测试类:
代码语言:javascript复制public static void main(String[] args) {
Approver directLeader = new DirectLeaderApprover();
Approver accounting = new AccountingApprover();
directLeader.setNextApprover(accounting);
ExpenseAccount expenseAccount = new ExpenseAccount("发票","报销单");
directLeader.doApprover(expenseAccount);
}
运行结果:
三、源码实例
(1)JDK的过滤器Filter就是典型的过滤器模式
代码语言:javascript复制public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)