java设计模式之责任链模式
责任链模式(Chain of Responsibility)是一种处理请求的模式,它让多个处理器都有机会处理该请求,直到其中某个处理成功为止。责任链模式把多个处理器串成链,然后让请求在链上传递:
看这个图是不是特别像过滤器的图,没错过滤器用的就是这个模式,它也叫过滤器模式,
在实际场景中,财务审批就是一个责任链模式。假设某个员工需要报销一笔费用,审核者可以分为:
Manager:只能审核1000元以下的报销;
Director:只能审核10000元以下的报销;
CEO:可以审核任意额度。
首先定义一个请求类
public class Request {
private String name;
private BigDecimal amount;
public Request(String name, BigDecimal amount) {
this.name = name;
this.amount = amount;
}
public String getName() {
return name;
}
public BigDecimal getAmount() {
return amount;
}
@Override
public String toString() {
return String.format("{Request: name=%s, amount=%s}", name, amount);
}
}
抽象出处理器:
public interface Handler {
// 返回Boolean.TRUE = 成功
// 返回Boolean.FALSE = 拒绝
// 返回null = 交下一个处理
Boolean process(Request request);
}
将请求和处理器组合起来
public class HandlerChain {
private List<Handler> handlers = new ArrayList<>();
public void addHandler(Handler handler) {
this.handlers.add(handler);
}
public boolean process(Request request) {
for (Handler handler : handlers) {
Boolean r = handler.process(request);
//防止穿透
if (r != null) {
System.out.println(
request + " " + (r ? "Approved by " : "Denied by ") + handler.getClass().getSimpleName());
return r;
}
}
throw new RuntimeException("Could not handle request: " + request);
}
}
直接领导实现的审批方式 审批金额小于10000的报销
public class DirectorHandler implements Handler {
@Override
public Boolean process(Request request) {
if (request.getAmount().compareTo(BigDecimal.valueOf(10000)) > 0) {
return null;
}
return !request.getName().equalsIgnoreCase("tom");
}
}
管理领导实现的审批方式 审批金额小于1000的报销
public class ManagerHandler implements Handler {
@Override
public Boolean process(Request request) {
if (request.getAmount().compareTo(BigDecimal.valueOf(1000)) > 0) {
return null;
}
return !request.getName().equalsIgnoreCase("bob");
}
}
ceo实现的审批方式 审批金额小于50000的报销
public class CEOHandler implements Handler {
@Override
public Boolean process(Request request) {
if (request.getAmount().compareTo(BigDecimal.valueOf(50000)) > 0) {
return Boolean.FALSE;
}
return !request.getName().equalsIgnoreCase("alice");
}
}
测试
public class Test {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new ManagerHandler());
chain.addHandler(new DirectorHandler());
chain.addHandler(new CEOHandler());
chain.process(new Request("Bob", new BigDecimal("123.45")));
chain.process(new Request("Alice", new BigDecimal("1234.56")));
chain.process(new Request("Bill", new BigDecimal("12345.67")));
chain.process(new Request("John", new BigDecimal("123456.78")));
}
}
测试
{Request: name=Bob, amount=123.45} Denied by ManagerHandler
{Request: name=Alice, amount=1234.56} Approved by DirectorHandler
{Request: name=Bill, amount=12345.67} Approved by CEOHandler
{Request: name=John, amount=123456.78} Denied by CEOHandler
代码库:
https://gitee.com/SlienceDemo/java-ee.git
责任链模式本身很容易理解,需要注意的是,Handler添加的顺序很重要,如果顺序不对,处理的结果可能就不是符合要求的。
责任链的遍历,在观察者模式中也有体现,可以参考一下下面的文章
观察者模式