责任链模式

122 阅读1分钟

用途

当有一连串的类似的设备都需要进行某些操作时,或者类似于审批单一层一层审批这种情况时,就可以组装责任链来优化代码。

类图

image.png

常见的实现

  1. 在抽象父类内部实现Builder模式,使用链表实现,组装时就可以像下面这样,使用此方式时,如果在实现类的doHandler()方法中间有执行跳出操作时,一定要记得next.doHandler()后return
// 组装链
AbsractHandler.builder builder = new AbstractHandler.Builder().addHandler(new CurrentHandler1()).addHandler(new CurrentHandler2());
// 执行
builder.doHandler();

抽象类实现

public abstract class AbstractHandler {
    /**
     * <链节点>
     */
    private AbstractHandler next;

    public void setNext(AbstractHandler next) {
        this.next = next;
    }

    public AbstractHandler getNext() {
        return this.next;
    }

    /**
     * <筛选设备>
     *
     * @param context <上下文>
     */
    public abstract void doFilter(Context context);

    /**
     * <链路构造器>
     *
     */
    public static class Builder {
        private AbstractHandler head;

        private AbstractHandler tail;

        /**
         * <添加节点>
         *
         * @param handler <具体执行类>
         * @return <构造器>
         */
        public Builder addHandler(AbstractHandler handler) {
            if (this.head == null) {
                this.head = handler;
                this.tail = handler;
                return this;
            }
            this.tail.setNext(handler);
            this.tail = handler;
            return this;
        }

        /**
         * <返回头结点>
         *
         * @return <头结点>
         */
        public AbstractHandler build() {
            return this.head;
        }
    }
}
  1. 不借助工具,直接new;
// 构造
CurrentHandler1 handler1 = new CurrentHandler1();
handler1.setNext(new CurrentHandler2());
// 执行
handler1.doHandler();
  1. 使用spring 给子类都加上@Component注解,作为单例bean添加进spring容器中
    再给子类添加@Order注解进行排序
    调用时使用@Autowired注解
// 构造
@Autowired
List<AbstractHandler> handlers;
// 执行
handlers.foreach(handler ->handler.doHandler());