责任链模式
一、定义
责任链模式:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
二、实现
1.首先定义一个处理器的接口
/** * 处理器接口 * @author yannic */ public interface IHandler { Boolean handle(); }
2.具体的处理器
/** * 处理器 * @author yannic */ public class HandlerA implements IHandler { @Override public Boolean handle() { Boolean handled = false; /** * 一些处理 */ System.out.println("HandlerA do something...."); return handled; } }
3.处理器链
/** * 处理器链 * * @author yannic */ public class HandlerChain { private List<IHandler> handlerList = new ArrayList<>(); /** * 添加处理器 * @param handler */ public void addHandle(IHandler handler) { handlerList.add(handler); } /** * 处理流程 */ public void doHandle() { for (IHandler handler : handlerList) { Boolean handled = handler.handle(); // 有一个处理了就不需要往下进行了 if (handled) { break; } } } }
4.测试
@Test
public void handleTest(){
HandlerChain handlerChain = new HandlerChain();
handlerChain.addHandle(new HandlerA());
handlerChain.addHandle(new HandlerB());
handlerChain.addHandle(new HandlerC());
handlerChain.doHandle();
}
运行结果:
HandlerA do something.... HandlerB do something.... HandlerC do something....
我们改一下HandleB的处理结果,handleB处理成功:
HandlerA do something.... HandlerB do something....
可以看到HandleB处理成功后就直接返回了,不会再传给HandleC处理了。
三、总结
当我们增加一个处理器时,不需要修改HandleChain的代码。或者我们想选择其中几个过滤器时,也不需要修改原代码。可以看到用责任链模式非常的易扩展。
实际开发时,我们不一定严格按照有一个处理器处理就返回的规则,有时候是需要所有处理器都处理一遍。