责任链模式的应用

概念


责任链模式是一种对象的行为模式,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。

场景


我们在遇到需要对一条数据进行处理,处理到一个标准,直到这个获取的结果满足这个标准。

实现

1、定义一个抽象处理器,来规定具体需要处理的方法。
在这里插入图片描述

2、HandlerChainContext handler上下文,主要负责维护链,和链的执行
在这里插入图片描述
1、处理器

// 处理器抽象类
public abstract class AbstractHandler<T> {
    /**
     * 处理器,这个处理器就做一件事情
     */
    // handler方法
    abstract T doHandler(HandlerChainContext<T> handlerChainContext, Object arg0);
}


@Component
@Order(10)
class Handler1 extends AbstractHandler<String> {
    @Override
    String doHandler(HandlerChainContext<String> handlerChainContext, Object arg0) {
        arg0 = arg0.toString() + "..handler1的处理结果.....";
        System.out.println("我是Handler1的实例,我在处理:" + arg0);
        if (String.valueOf(arg0).length() > 20) {
            return String.valueOf(arg0);
        }
        // 继续执行下一个
       return handlerChainContext.runNext(arg0);
    }
}

@Component
@Order(20)
class Handler2 extends AbstractHandler<String> {
    @Override
    String doHandler(HandlerChainContext<String> handlerChainContext, Object arg0) {
        arg0 = arg0.toString() + "..handler2的处理结果.....";
        System.out.println("我是Handler2的实例,我在处理:" + arg0);
        if (String.valueOf(arg0).length() > 20) {
            return String.valueOf(arg0);
        }
        // 继续执行下一个
        return handlerChainContext.runNext(arg0);
    }


}

2、handler上下文

/**
 * handler上下文,主要负责维护链,和链的执行
 */
public class HandlerChainContext<T> {

    // 下一个节点
    HandlerChainContext<T> next;
    AbstractHandler<T> handler;

    /**
     * 初始化的时候造一个head,作为责任链的开始,但是并没有具体的处理
     */
    public HandlerChainContext head;

    public HandlerChainContext() {
       this.head = new HandlerChainContext<T>(new AbstractHandler<T>() {
            @Override
            T doHandler(HandlerChainContext<T> handlerChainContext, Object arg0) {
                return   handlerChainContext.runNext(arg0);
            }
        });
    }

    public HandlerChainContext(AbstractHandler handler) {
        this();
        this.handler = handler;
    }

   public T handler(Object arg0) {
       return this.handler.doHandler(this, arg0);
    }

    /**
     * 继续执行下一个
     */
     T runNext(Object arg0) {
        if (this.next != null) {
           return this.next.handler(arg0);
        }
         return null;
    }



    public T requestProcess(Object arg0) {
        return (T) this.head.handler(arg0);
    }

    public void addLast(AbstractHandler handler) {
        HandlerChainContext context = head;
        while (context.next != null) {
            context = context.next;
        }
        context.next = new HandlerChainContext(handler);
    }

}

3、客户端

@Service
public class ChainModelDemo {


    @Autowired
    private List<AbstractHandler> handlerList;




    @PostConstruct
    public void adjustChainOrder(){
        handlerList = Optional.ofNullable(handlerList).orElseGet(ArrayList::new);
        handlerList.sort(AnnotationAwareOrderComparator.INSTANCE);
        HandlerChainContext<String> handlerChainContext = new HandlerChainContext();
        for (AbstractHandler handler : handlerList) {
            handlerChainContext.addLast(handler);
        }
        String result = handlerChainContext.requestProcess("执行入参");
        System.out.println(result);
    }
}

执行结果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值