云原生Java设计模式8,校验审批流程改善神器,责任链模式
Posted 哪 吒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生Java设计模式8,校验审批流程改善神器,责任链模式相关的知识,希望对你有一定的参考价值。
目录
一、责任链模式
最近在做一个数据校验的功能,需要校验的东西很多,有的从数据库中查询,有的是固定的数值校验,有的是数据类型校验, 如果通过ifelse来写,也是没问题的。
但,为了代码的优雅和可扩展性,我选择尝试一下责任链模式,责任链模式的核心是解决一组服务中的先后执行处理关系。
责任链模式(Chain of Responsibility Pattern)是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。
二、责任链模式的优缺点
1、优点
- 减少大量ifelse;
- 逻辑清晰明了,添加删除节点、改变节点顺序方便快捷;
- 请求与处理解耦;
- 请求处理者只需关注自己感兴趣的请求,对于不感兴趣的请求,直接转发给下一级节点对象;
- 易于扩展新的请求处理类,符合开闭原则;
2、缺点
- 责任链太长或处理时间过长,会影响整体性能。
- 如果需要判断的东西较多,容易造成类保证;
- 如果每个判断逻辑较简单,可能会造成一个类只做一个小小的数值判断,哈哈;
- 如果节点对象存在循环链接,可能会造成死循环;
三、违背原则方案
对实体类程序员Programmer的数据进行校验,校验名字、项目、项目完成时间。
力求通过最简单的代码,通俗易懂的讲解责任链模式。
1、Programmer实体类
package com.guor.bean;
import lombok.Data;
import java.util.Date;
@Data
public class Programmer
// 姓名
private String name;
// 项目
private String project;
// 模块
private String module;
// 进度
private double schedule;
// 计划完成时间
private Date completePlanTime;
// 详细信息
private String info;
2、数据校验
package com.guor.chain;
import com.guor.bean.Programmer;
public class Check
public boolean programmerCheck(Programmer programmer)
if(!"公众号".equals(programmer.getProject()))
return false;
if(!"哪吒编程".equals(programmer.getName()))
return false;
if(!programmer.getInfo().equals("公众号哪吒编程,定期分享Java干货,还有不定期的送书活动,包邮到你家,哈哈"))
return false;
return true;
一堆ifelse安排上,代码还是比较清晰易懂的,再有新的判断,就继续添加ifelse就完了。
3、但是,似乎违反了一些设计原则
- 单一职责原则:指一个类或者模块应该有且只有一个改变的原因。
- 开闭原则:软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。
- 接口隔离原则:尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。
四、通过责任链模式重构代码
1、链路抽象类定义
这部分是责任链模式的核心代码,重点在于通过next获取下一个节点。
定义一个抽象方法doHandler供子类去实现,实现不同的业务逻辑。
package com.guor.chain;
import com.guor.bean.Programmer;
public abstract class Handler<T>
protected Handler next;
private void next(Handler next)
this.next = next;
public abstract boolean doHandler(Programmer programmer);
public static class Builder<T>
private Handler<T> head;
private Handler<T> tail;
public Builder<T> addHandler(Handler handler)
if (this.head == null)
this.head = this.tail = handler;
return this;
this.tail.next(handler);
this.tail = handler;
return this;
public Handler<T> build()
return this.head;
2、校验项目名称
package com.guor.chain;
import com.guor.bean.Programmer;
/**
* 校验项目名称
*/
public class ProjectHandler extends Handler
@Override
public boolean doHandler(Programmer programmer)
if(!"公众号".equals(programmer.getProject()))
return false;
if(null == next)
return true;
return next.doHandler(programmer);
3、校验名字
package com.guor.chain;
import com.guor.bean.Programmer;
/**
* 校验名字
*/
public class NameHandler extends Handler
@Override
public boolean doHandler(Programmer programmer)
if(!"哪吒编程".equals(programmer.getName()))
return false;
if(null == next)
return true;
return next.doHandler(programmer);
4、校验活动细节
package com.guor.chain;
import com.guor.bean.Programmer;
/**
* 校验活动细节
*/
public class InfoHandler extends Handler
@Override
public boolean doHandler(Programmer programmer)
if(!programmer.getInfo().contains("扫描文末二维码,关注公众号哪吒编程,定期分享Java干货,还有不定期的送书活动,包邮到你家"))
return false;
if(null == next)
return true;
return next.doHandler(programmer);
- 先进行项目名称校验;
- 如果校验不通过,直接返回false;
- 如果校验通过,查看是否还有下一个校验节点;
- 如果没有,则直接返回;
- 如果有,则进行下一个节点的校验;以此类推!
5、测试类
责任链模式的设计,可以方便的进行扩展和维护,去掉了低俗的ifelse代码。
实际项目中的数据校验要复杂的多,还有一些审批流程、付款流程,都可以通过责任链模式进行改造,非常好用!
很多人觉得设计模式很简单,但是,能够熟练的将设计模式应用在自己的项目中,将各模块、功能规划的井井有条,运用的炉火纯青、恰到好处,真的很难。反复阅读,仔细体会。
文末送书:送8本《Java核心技术》第12版
送书方式:查看👇🏻👇🏻👇🏻,回复9527,获取活动方式👇🏻👇🏻👇🏻,或私信哪吒参与
以上是关于云原生Java设计模式8,校验审批流程改善神器,责任链模式的主要内容,如果未能解决你的问题,请参考以下文章
云原生网关 APISIX 的核心流程以源码分析的方式剖析其工作原理
本人java菜鸟一枚,公司最近让负责一个类似钉钉的通用审批工作流引擎的流程接口设计,求大神解救!