链式调用

很多文章都是先告诉你概念在举例,其实效果并不好。毕竟我连东西都每见过,你就开始告诉我,它有什么特点,有何作用等等。

所以我决定,先给你们看实例,让你先有一个大概认识,等讲到概念的时候,再对照着实例去做验证,这样印象应该深刻一些

实例

节点

/**
 * 这是执行链的处理节点
 */
public abstract class Handler {

    /**
     * execute 与 执行链中的process 相互调用,不断循环,直到执行到最后一个节点
     *
     * @param chain 执行链
     */
    public void execute(Chain chain) {
        // 先执行当前节点的处理方法
        process();
        // 在执行 执行链 中的 process
        chain.process();
    }

    /**
     * process 是该节点的 处理方法
     * 执行链的每一个节点都要重写 process 方法,并在里面写上自己的处理逻辑
     */
    abstract void process();
}
复制代码

执行链

/**
 * 执行链
 */
public class Chain {

    // 节点列表,里面是要执行的节点
    private List<Handler> list;

    // 游标,指向要执行的节点,默认从0开始
    private int index = 0;

    // 构造方法,传人一个 节点列表
    public Chain(List<Handler> list) {
        this.list = list;
    }

    /**
     * 按照顺序执行节点列表中的节点
     * process 与 节点的execute方法 相互调用,不断循环,直到执行到最后一个节点
     */
    public void process() {
        // 节点列表是否为null 或者 游标已经走完了最后一个节点
        if (list == null || index >= list.size()) {
            return;
        }
        //执行顺序 1获取游标指向的节点 2游标+1 3执行节点的execute方法,并将自己传递进去
        list.get(index++).execute(this);
    }
}
复制代码

测试类

public class Test {

    /**
     * 这是节点A,它重写了节点的process方法
     */
    static class HandlerA extends Handler {

        @Override
        protected void process() {
            System.out.println("执行HandlerA的命令");
        }
    }

    /**
     * 这是节点B,它重写了节点的process方法
     */
    static class HandlerB extends Handler {

        @Override
        protected void process() {
            System.out.println("执行HandlerB的命令");
        }
    }

    /**
     * 这是节点C,它重写了节点的process方法
     */
    static class HandlerC extends Handler {

        @Override
        protected void process() {
            System.out.println("执行HandlerC的命令");
        }
    }


    public static void main(String[] args) {
        /**
         * 创建一个节点列表,并按照执行顺序添加节点对象
         */
        List<Handler> list = Arrays.asList(
                new HandlerA(),
                new HandlerB(),
                new HandlerC()
        );
        // 根据 节点列表 初始化一个 执行链
        Chain chain = new Chain(list);
        //调用
        chain.process();
    }
}
复制代码

概念

上面的例子就是 Spring AOP 处理多个切面作用同一个目标方法的实现。 其实就是切面1调用切面2,切面2调用切面3...切面n调用目标方法。

组成

链式调用 主要有两个类

  • 节点抽象类
  • 执行链类

任何一个点节点类都必须继承节点抽象类并重写要执行的方法 执行链类需要一个节点列表来告诉它执行顺序 执行链 与 节点相互调用,不断循环,直到最后一个节点(注意,这个地方要处理好,不然容易死循环)

作用

按照 指定的先后顺序,批量执行自定义的方法。

转载于:https://juejin.im/post/5ccef1b951882541cb23c842

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值