工作中常用的设计模式 -- 责任链模式

本文介绍了责任链模式在Java业务开发中的应用,强调了责任链模式的角色和实际业务场景,例如用户留资进线的逻辑处理。文章探讨了如何避免模式的缺点,如外部编排和内部编排,以及在Spring框架下实现处理器的灵活性。同时,提出了责任链模式与策略模式的区别,并提醒读者在使用时注意避免循环引用。
摘要由CSDN通过智能技术生成

一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为 Java,基于 Spring 框架。

1 责任链模式(Chain of Responsibility Pattern)

对数据流、对象做一系列过滤、校验、处理等操作,该操作通常是有序的。该场景在生活中还是很常见的,如大家经常举例的各种审批流。再如面试,需要通过一面、二面、三面、HR 面等,最终拿下 Offer。这些都属于责任链的场景,

责任链模式一般有 3 个角色:

  • Client: 客户端。用来编排处理器,可静态、也可运行时动态生成。类似单链表。

  • Handler: 接口或抽象类。约定处理函数名称、参数等。

  • ConcreteHandler: 具体处理器。

这种出现的场景其实挺多,但真正使用的却不是很多。这就要提到责任链的几个缺点:灵活动态既是优点也是缺点,使得程序不够直观,流程不够明了。甚至可能出现循环引用(死循环)的情况。

责任链的编排一般有两种:

  • 外部编排:具体处理器,仅根据 Contex 参数进行处理,并将结果回写 Contex。内部不做编排。相对比较独立(纯粹)的逻辑处理单元。

  • 内部编排:类似单链表。在执行过程中,根据 Context 参数的处理结果,判断是否需要进行下一步(进入下一个处理器)。相对外部编排,灵活度略低一些。

1.1 实际业务场景

在用户留资进线场景中,我们需要根据线索的渠道号、落地页来源、学科等做不同的逻辑处理。但在未得到实际参数前,我们是不能确定具体要走哪些处理器。一些业务规则(简化):

  • 渠道号(channel)不能为空

  • 某些特殊渠道号,推荐人不能为空

  • 某些落地页来源(lpv),偏好语言不能为空

只有全部符合条件的线索,才能实际进入到 CRM 系统中。

线索 LeadsBO

@Data@Builderpublic class LeadsBO {
      // 渠道号    private String channel;    // 推荐人ID    private Long referrerId;    // 学科 1:中文 2:英文    private Integer subject;    // 落地页版本(Landing Page Version)    private Strin
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值