责任链模式的核心是解决一组服务中的先后执行处理关系,就有点像你没钱花了,需要家庭财务支出审批,10块钱以下找闺女审批,100块钱先闺女审批在媳妇审批。
未使用责任链模式代码
多级审批写在一个类里面,用大量的if…else进行审批逻辑判断
public class AuthController {
private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public AuthInfo doAuth(String uId, String orderId, Date authDate) throws ParseException {
// 三级审批
Date date = AuthService.queryAuthInfo("1000013",orderId);
if (null == date) {
return new AuthInfo("0001","单号:",orderId," 状态:待三级审批负责人 ", "三级员工");
}
// 二级审批
if (authDate.after(format.parse("2020-06-01 00:00:00")) && authDate.before(format.parse("2020-06-25 23:59:59"))) {
date = AuthService.queryAuthInfo("1000012",orderId);
if (null == date) {
return new AuthInfo("0001","单号:",orderId," 状态:待二级审批负责人 ", "二级员工");
}
}
// 一级审批
if(authDate.after(format.parse("2020-06-11 00:00:00"))&&authDate.before(format.parse("2020-06-20 23:59:59"))){
date = AuthService.queryAuthInfo("1000011",orderId);
if (null ==date) {
return new AuthInfo("0001","单号:",orderId," 状态:待一级审批负责人 ", "一级员工");
}
}
return new AuthInfo("0001", "单号:", orderId, " 状态:审批完成");
}
}
使用责任链模式重构
核心是创建一个包含多级审批类的责任链抽象类AuthLink,一级一级进行审批操作
AuthLink authLink = new Level3AuthLink("1000013", "王工")
.appendNext(new Level2AuthLink("1000012", "张经理")
.appendNext(new Level1AuthLink("1000011", "段总")));
责任链类
public abstract class AuthLink {
private Logger logger = LoggerFactory.getLogger(AuthLink.class);
protected SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
protected String levelUserId;
protected String levelUserName;
private AuthLink next;
public AuthLink(String levelUserId, String levelUserName) {
this.levelUserId = levelUserId;
this.levelUserName = levelUserName;
}
public AuthLink getNext(){
return next;
}
public AuthLink appendNext(AuthLink next){
this.next = next;
return this;
}
// 审批接口
public abstract AuthInfo doAuth(String uId, String orderId, Date authDate);
}
一级审批人
public class Level3AuthLink extends AuthLink {
public Level3AuthLink(String levelUserId, String levelUserName) {
super(levelUserId, levelUserName);
}
public AuthInfo doAuth(String uId, String orderId, Date authDate) {
Date date = AuthService.queryAuthInfo(levelUserId, orderId);
if (null == date) {
return new AuthInfo("0001", "单号:", orderId, " 状态:待三级负责人审批 ", levelUserName);
}
AuthLink next = super.getNext();
return next.doAuth(uId, orderId, authDate);
}
}
二级审批人
public class Level2AuthLink extends AuthLink {
private Date beginDate = f.parse("2020-06-01 00:00:00");
private Date endDate = f.parse("2020-06-25 23:59:59");
public Level2AuthLink(String levelUserId, String levelUserName) throws ParseException {
super(levelUserId, levelUserName);
}
@Override
public AuthInfo doAuth(String uId, String orderId, Date authDate) {
Date date = AuthService.queryAuthInfo(levelUserId, orderId);
if (null == date) {
return new AuthInfo("0001", "单号:", orderId, " 状态:待二级负责人审批 ", levelUserName);
}
AuthLink next = super.getNext();
return next.doAuth(uId, orderId, authDate);
}
}
三级审批人
public class Level1AuthLink extends AuthLink {
private Date beginDate = f.parse("2020-06-11 00:00:00");
private Date endDate = f.parse("2020-06-20 23:59:59");
public Level1AuthLink(String levelUserId, String levelUserName) throws ParseException {
super(levelUserId, levelUserName);
}
@Override
public AuthInfo doAuth(String uId, String orderId, Date authDate) {
Date date = AuthService.queryAuthInfo(levelUserId, orderId);
if (null == date) {
return new AuthInfo("0001", "单号:", orderId, " 状态:待一级审批负责人 ", levelUserName);
}
AuthLink next = super.getNext();
if (null == next && authDate.after(beginDate) && authDate.before(endDate)) {
return new AuthInfo("0000", "单号:", orderId, " 状态:三级审批负责人完成", " 时间:", f.format(date), " 审批人:", levelUserName);
}
return null;
}
}
审批服务
public class AuthService {
private static Map<String, Date> authMap = new HashMap<>();
public static Date queryAuthInfo(String uId, String orderId) {
return authMap.get(uId.concat(orderId));
}
public static void auth(String uId, String orderId) {
authMap.put(uId.concat(orderId), new Date());
}
}
审批信息
public class AuthInfo {
private String code;
private String info = "";
public AuthInfo(String code,String ...infos){
this.code =code;
for (String info:infos) {
this.info = this.info.concat(info);
}
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
ApiTest
@Test
public void test() throws ParseException {
AuthLink authLink = new Level3AuthLink("1000013", "王工")
.appendNext(new Level2AuthLink("1000012", "张经理")
.appendNext(new Level1AuthLink("1000011", "段总")));
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date currentDate = f.parse("2020-06-18 23:49:46");
logger.info("测试结果:{}", JSON.toJSONString(authLink.doAuth("磊哥", "1000998004813441", currentDate)));
// 模拟三级负责人审批
AuthService.auth("1000013", "1000998004813441");
logger.info("测试结果:{}", "模拟三级负责人审批,王工");
logger.info("测试结果:{}", JSON.toJSONString(authLink.doAuth("磊哥", "1000998004813441", currentDate)));
// 模拟二级负责人审批
AuthService.auth("1000012", "1000998004813441");
logger.info("测试结果:{}", "模拟二级负责人审批,张经理");
logger.info("测试结果:{}", JSON.toJSONString(authLink.doAuth("磊哥", "1000998004813441", currentDate)));
// 模拟一级负责人审批
AuthService.auth("1000011", "1000998004813441");
logger.info("测试结果:{}", "模拟一级负责人审批,段总");
logger.info("测试结果:{}", JSON.toJSONString(authLink.doAuth("磊哥", "1000998004813441", currentDate)));
}
结果
17:48:12.454 [main] INFO cn.leilei.chain.test.ApiTest - 测试结果:{"code":"0001","info":"单号:1000998004813441 状态:待三级负责人审批 王工"}
17:48:12.458 [main] INFO cn.leilei.chain.test.ApiTest - 测试结果:模拟三级负责人审批,王工
17:48:12.458 [main] INFO cn.leilei.chain.test.ApiTest - 测试结果:{"code":"0001","info":"单号:1000998004813441 状态:待二级负责人审批 张经理"}
17:48:12.458 [main] INFO cn.leilei.chain.test.ApiTest - 测试结果:模拟二级负责人审批,张经理
17:48:12.458 [main] INFO cn.leilei.chain.test.ApiTest - 测试结果:{"code":"0001","info":"单号:1000998004813441 状态:待一级审批负责人 段总"}
17:48:12.458 [main] INFO cn.leilei.chain.test.ApiTest - 测试结果:模拟一级负责人审批,段总
17:48:12.459 [main] INFO cn.leilei.chain.test.ApiTest - 测试结果:{"code":"0000","info":"单号:1000998004813441 状态:三级审批负责人完成 时间:2024-05-02 17:48:12 审批人:段总"}