【设计模式】责任链模式

前言今天开一个新坑,讲讲设计模式。从常用的设计模式入手,今天讲讲责任链模式。今天的例子都是基于Spring的。使用场景及三种控制模式啥是责任链模式呢?其实大家看了这么多博客,大多数举的例子是各种各样领导审批流程,当然这是最常见的使用场景。其实实际开发也有使用。例如servlet的Filter过滤器,消息处理器等等。个人总结责任链主要注意以下几点:有无返回值责任链大多数情况是需要返回值的,也就是每一步处理的结果。但是也有这样的场景,例如处理某一条消息,会有不同的处理器执行,处理器之间是不关心其他
摘要由CSDN通过智能技术生成

前言

今天开一个新坑,讲讲设计模式。从常用的设计模式入手,今天讲讲责任链模式。今天的例子都是基于Spring的。

使用场景及三种控制模式

啥是责任链模式呢?其实大家看了这么多博客,大多数举的例子是各种各样领导审批流程,当然这是最常见的使用场景。其实实际开发也有使用。例如servletFilter过滤器,消息处理器等等。
个人总结责任链主要注意以下几点:

  • 有无返回值
    责任链大多数情况是需要返回值的,也就是每一步处理的结果。但是也有这样的场景,例如处理某一条消息,会有不同的处理器执行,处理器之间是不关心其他的结果的,这种场景就是无返回值的责任链。
  • 控制模式
    这里控制模式指的是如何控制节点指向下一个处理节点的行为,根据这个可以分为:内部控制模式外部控制模式节点控制模式 ,接下来会详细讲解的。

代码实现

内部控制模式

内部控制模式,顾名思义,就是通过手动指定下一个节点。一般是有个抽象类,抽象方法执行的是个个责任链节点的处理逻辑,代码如下。

核心类
public abstract class AbstractChainHandler<T extends Serializable> {
   
    /**
     * 下一个责任链节点
     */
    protected AbstractChainHandler<T> nextHandler;

    public void handle(T msg) {
   
        // 本次处理
        handleRequest(msg);

        // 流转到下一个节点处理
        Optional.ofNullable(nextHandler).ifPresent(handler -> handler.handle(msg));
    }

    /**
     * 本次处理器处理逻辑
     *
     * @param msg 流水/回执
     */
    protected abstract void handleRequest(T msg);
}

实体类
@Data
@AllArgsConstructor
public class TestDTO implements Serializable {
   
    private String name;
    private String userId;
}

下面是模拟两个节点处理,如果需要返回结果的话,自己定义结果类即可。

第一个处理节点
@Slf4j
@Service
public class FirstHandler extends AbstractChainHandler<TestDTO> {
   

    public FirstHandler(SecondHandler secondHandler) {
   
        this.nextHandler = secondHandler;
    }

    @Override
    protected void handleRequest(TestDTO msg) {
   
        log.in
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值