有趣的链式调用

本文探讨了一个有趣的Java链式调用实现案例。通过创建一个处理者链,包括QQQHandler, TestHandler和JXDHandler,每个处理器都有自己的handle()方法,依次执行,实现了按顺序处理组件上下文的效果。" 1808917,186606,C++实现事件(Event)机制详解,"['C++编程', '事件处理', '模板类']
摘要由CSDN通过智能技术生成

今天在公司接收一个其他人做的项目,发现一个有趣的链式调用。

先看下这个链的chou'xian

public abstract class AbstractHandler {

    protected String uuid;
    protected String code;  


    protected String logMessagePrefix;

    protected String logMessageFormat = "[%s]-[%s-%s]-[接口%s]-[%s]---";

    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    private ThreadLocal<AbstractHandler> nexHandler = new ThreadLocal<>();
//ComponentContext  可以不用管
    protected void init(ComponentContext context, String moduleType) {
        this.uuid = context.getUUID();
        this.code = context.getCapitalCode();

    }

    /**
     * 设置下游处理类
     *
     * @param _nextHandler
     * @return AbstractHandler
     * @author xjt
     * @data 2019/3/20 16:29
     */
    public AbstractHandler setNextHandler(AbstractHandler _nextHandler) {
        if (_nextHandler != null) {
            _nextHandler.setNextHandler(null);
        }
        this.nexHandler.set(_nextHandler);
        return this.nexHandler.get();
    }

    /**
     * 处理
     *
     * @param context
     */
    public ComponentContext handle(ComponentContext context) {
        nextHandle(context);
        return context;
    }

    /**
     * 下游处理
     *
     * @param context
     */
    protected void nextHandle(ComponentContext context) {
        if (this.nexHandler.get() != null) {
            logger.info("[{}]当前链[{}]处理结束,调用下一个链[{}]", context.getUUID(), this.getClass().getSimpleName(), this.nexHandler.get().getClass().getSimpleName());
            this.nexHandler.get().handle(context);
            this.nexHandler.remove();
        }
    }

    @PreDestroy
    public void destory(){}


    @Override
    public String toString() {
        return "\n-->" + this.getClass().getName() + (null == this.nexHandler.get() ? "" : this.nexHandler.get().toString());
    }
}

然后看下具体实现:我们分别有三个实现 QQQ,Test  JXD 大体都一样

public class QQQHandler extends AbstractHandler {


    /**
     * 处理
     *
     * @param context
     */
    public ComponentContext handle(ComponentContext context) {
        doA();
        return super.handle(context);
    }


    public void doA(){
        System.out.println("QQQ");
    }
}
public class TEstHandler extends AbstractHandler {


    /**
     * 处理
     *
     * @param context
     */
    public ComponentContext handle(ComponentContext context) {
        doA();
        return super.handle(context);
    }

    public void doA(){
        System.out.println("Test");
    }
}
public class JXDHandler extends AbstractHandler {


    /**
     * 处理
     *
     * @param context
     */
    public ComponentContext handle(ComponentContext context) {
        doA();
        return super.handle(context);
    }

    public void doA() {
        System.out.println("JXD");
    }

  
}

开始执行:

public static void main(String[] args) {

AbstractHandler root = null;

AbstractHandler parent = null;

List<AbstractHandler> arr = new ArrayList<>();

arr.add(new JXDHandler());

arr.add(new TEstHandler()); arr.add(new QQQHandler());

ComponentContext componentContext = new ComponentContext();

for (AbstractHandler current : arr) {

if (root == null) { root = current; }

else { parent.setNextHandler(current);

} parent = current;

}

root.handle(componentContext);

}

执行结果:按照顺序 JXD  test  QQQ 每个 具体现象都可以在handle()方法里写自己的。

他这种处理方式是每一个里边都有自己的

ThreadLocal 然后存储下一个执行的逻辑,代码很简单,看下就懂

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值