一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为 Java,基于 Spring 框架。
1 责任链模式(Chain of Responsibility Pattern)
对数据流、对象做一系列过滤、校验、处理等操作,该操作通常是有序的。该场景在生活中还是很常见的,如大家经常举例的各种审批流。再如面试,需要通过一面、二面、三面、HR 面等,最终拿下 Offer。这些都属于责任链的场景,
责任链模式一般有 3 个角色:
-
Client: 客户端。用来编排处理器,可静态、也可运行时动态生成。类似单链表。
-
Handler: 接口或抽象类。约定处理函数名称、参数等。
-
ConcreteHandler: 具体处理器。
这种出现的场景其实挺多,但真正使用的却不是很多。这就要提到责任链的几个缺点:灵活动态既是优点也是缺点,使得程序不够直观,流程不够明了。甚至可能出现循环引用(死循环)的情况。
责任链的编排一般有两种:
-
外部编排:具体处理器,仅根据 Contex 参数进行处理,并将结果回写 Contex。内部不做编排。相对比较独立(纯粹)的逻辑处理单元。
-
内部编排:类似单链表。在执行过程中,根据 Context 参数的处理结果,判断是否需要进行下一步(进入下一个处理器)。相对外部编排,灵活度略低一些。
1.1 实际业务场景
在用户留资进线场景中,我们需要根据线索的渠道号、落地页来源、学科等做不同的逻辑处理。但在未得到实际参数前,我们是不能确定具体要走哪些处理器。一些业务规则(简化):
-
渠道号(channel)不能为空
-
某些特殊渠道号,推荐人不能为空
-
某些落地页来源(lpv),偏好语言不能为空
只有全部符合条件的线索,才能实际进入到 CRM 系统中。
线索 LeadsBO
@Data
@Builder
public class LeadsBO {
// 渠道号
private String channel;
// 推荐人ID
private Long referrerId;
// 学科 1:中文 2:英文
private Integer subject;
// 落地页版本(Landing Page Version)
private Strin