AbstractLinkedProcessorSlot通过保存指向下一个处理器的对象的进行关联 , 整体以链表的形式进行串联 。
public class CtSph implements Sph {private Entry entryWithPriority(ResourceWrapper resourceWrapper, int count, boolean prioritized, Object... args)throws BlockException {Context context = ContextUtil.getContext();// 省略相关代码ProcessorSlot<Object> chain = lookProcessChain(resourceWrapper);Entry e = new CtEntry(resourceWrapper, chain, context);// 驱动责任链上的第一个处理器,进而由处理器自驱动执行下一个处理器chain.entry(context, resourceWrapper, null, count, prioritized, args);return e;}}public class DefaultProcessorSlotChain extends ProcessorSlotChain {// 创建DefaultProcessorSlotChain的头尾节点first和endAbstractLinkedProcessorSlot<?> first = new AbstractLinkedProcessorSlot<Object>() {@Overridepublic void entry(Context context, ResourceWrapper resourceWrapper, Object t, int count, boolean prioritized, Object... args)throws Throwable {super.fireEntry(context, resourceWrapper, t, count, prioritized, args);}@Overridepublic void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args) {super.fireExit(context, resourceWrapper, count, args);}};AbstractLinkedProcessorSlot<?> end = first;@Overridepublic void addLast(AbstractLinkedProcessorSlot<?> protocolProcessor) {end.setNext(protocolProcessor);end = protocolProcessor;}}public abstract class AbstractLinkedProcessorSlot<T> implements ProcessorSlot<T> {private AbstractLinkedProcessorSlot<?> next = null;@Overridepublic void fireEntry(Context context, ResourceWrapper resourceWrapper, Object obj, int count, boolean prioritized, Object... args)throws Throwable {// 触发下一个处理器对象的处理if (next != null) {next.transformEntry(context, resourceWrapper, obj, count, prioritized, args);}}void transformEntry(Context context, ResourceWrapper resourceWrapper, Object o, int count, boolean prioritized, Object... args)throws Throwable {T t = (T)o;// 执行具体处理器的逻辑,由具体的处理器自行实现entry(context, resourceWrapper, t, count, prioritized, args);}public void setNext(AbstractLinkedProcessorSlot<?> next) {// 绑定下一个处理器的逻辑this.next = next;}}
说明:- 整个责任链上处理器的执行通过Invoker对象的驱动,而非责任链对象的驱动 。
- DefaultProcessorSlotChain的entry首先头部对象first,进而触发处理器的自驱实现处理器的执行 。
- 整体按照entry →fireEntry →
transformEntry→ entry的循环顺序依次触发处理器的自驱 。
譬如对于支持用户生成内容(UGC)的应用来说,用户生成的内容可能包含一些敏感内容如敏感言论或者图片等 。针对这种应用场景 , 可以通过责任链模式设置多个处理器来处理不同的任务,如文本过滤器处理敏感词,图片过滤器处理敏感图片等等 。
譬如对于电商服务中的下单流程来说,一个下单流程包含订单拆合单 , 优惠计算,订单生成等多个步骤,我们可以通过责任链模式设置多个处理器来处理不同的任务等等 。
责任链的应用场景非常广泛,在常见的开源框架中有丰富的落地场景,同样在业务开发中也可以根据场景灵活使用 。
【开源框架中的责任链模式实践】
推荐阅读
- CORS 跨域资源共享在Spring Boot中的实现
- Java面试题之SpringBoot 框架
- 一文读懂Spring框架中的不同类型事件
- RouterSploit:一款功能强大的嵌入式设备渗透测试框架
- 校友眼中的李雪琴是个“怪人”,内耗严重,父母离婚是病因!
- 杨梅核能吞吗?杨梅核吞入胃中的好处
- 杭州电子厂老板,25年来待客只用“假茅台”,行家:高手中的高手
- 筱在名字中的寓意是什么
- 薛平贵中的西凉是哪里 西凉是哪里
- 祭祀之礼是指 祭祀之礼是指五礼中的