开源框架中的责任链模式实践( 六 )


AbstractLinkedProcessorSlot通过保存指向下一个处理器的对象的进行关联 , 整体以链表的形式进行串联 。

  • 责任链上的第一个处理器对象first本身不起任何作用,只是保存链表的头部 。
  • 3.4.4 责任链执行
    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)的应用来说,用户生成的内容可能包含一些敏感内容如敏感言论或者图片等 。针对这种应用场景 , 可以通过责任链模式设置多个处理器来处理不同的任务,如文本过滤器处理敏感词,图片过滤器处理敏感图片等等 。
    譬如对于电商服务中的下单流程来说,一个下单流程包含订单拆合单 , 优惠计算,订单生成等多个步骤,我们可以通过责任链模式设置多个处理器来处理不同的任务等等 。
    责任链的应用场景非常广泛,在常见的开源框架中有丰富的落地场景,同样在业务开发中也可以根据场景灵活使用 。
     

    【开源框架中的责任链模式实践】


    推荐阅读