java设计模式之责任链模式(附源码)

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添加的顺序很重要,如果顺序不对,处理的结果可能就不是符合要求的。

责任链的遍历,在观察者模式中也有体现,可以参考一下下面的文章
观察者模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值