责任链模式

一、定义

  责任链模式:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

二、实现

  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的代码。或者我们想选择其中几个过滤器时,也不需要修改原代码。可以看到用责任链模式非常的易扩展。

  实际开发时,我们不一定严格按照有一个处理器处理就返回的规则,有时候是需要所有处理器都处理一遍。

原文地址:https://www.cnblogs.com/ITyannic/p/12907610.html