今天在公司接收一个其他人做的项目,发现一个有趣的链式调用。
先看下这个链的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 然后存储下一个执行的逻辑,代码很简单,看下就懂