设计模式责任链模式之模拟工单流转
Posted lisin-lee-cooper
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式责任链模式之模拟工单流转相关的知识,希望对你有一定的参考价值。
一.概念
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
二.场景
现场出现特殊需要处理的情况、客户电话投诉或者订单发生状态转变需要触发其他连带修改的场景,一般都是一线人员会创建工单跟进,然后工单是有一定的处理流程的:
客服专员先审核工单,能处理则自己处理,不能处理则转到客服领班;
客服领班审核工单,能处理则自己处理,不能处理则转到客服经理;
客服经理处理工单,得到工单的最终状态。
三.类图及代码实现
3.1 类图
3.2 代码实现
3.2.1 审核抽象类定义
@Data
public abstract class VerifyService {
protected String optId;
protected String optName;
protected String type;
private VerifyService next;
public VerifyService(String optId, String optName, String type) {
this.optId = optId;
this.optName = optName;
this.type = type;
}
public VerifyService getNext() {
return this.next;
}
public VerifyService setNext(VerifyService next) {
this.next = next;
return this;
}
public abstract String verify(String optId, String optName, String type);
}
3.2.2 客服专员初审
@Slf4j
public class CommissionerVerify extends VerifyService {
public CommissionerVerify(String userId, String userName, String type) {
super(userId, userName, type);
}
@Override
public String verify(String optId, String optName, String type) {
if (this.getType().equalsIgnoreCase(type)) {
log.info("客服专员id:{},名称:{},处理成功, it is so {}", optId, optName, type);
return "success";
}
log.info("客服专员无法处理,流转到客服领班");
return this.getNext().verify(this.getNext().getOptId(), this.getNext().getOptName(), type);
}
}
3.2.3 客服领班次审
@Slf4j
public class ForemanVerify extends VerifyService {
public ForemanVerify(String userId, String userName, String type) {
super(userId, userName, type);
}
@Override
public String verify(String optId, String optName, String type) {
if (this.getType().equalsIgnoreCase(type)) {
log.info("客服领班id:{},名称:{},处理成功, it is so {}", optId, optName, type);
return "success";
}
log.info("客服领班无法处理,流转到客服经理");
return this.getNext().verify(this.getNext().getOptId(), this.getNext().getOptName(), type);
}
}
3.2.4 客服经理终审
@Slf4j
public class ManagerVerify extends VerifyService {
public ManagerVerify(String optId, String optName, String type) {
super(optId, optName, type);
}
@Override
public String verify(String optId, String optName, String type) {
if (this.getType().equalsIgnoreCase(type)) {
log.info("客服经理id:{},名称:{},处理成功, it is so {}", optId, optName, type);
return "success";
}
log.info("客服经理无法处理,直接gg");
return "error:\\n\\t此类问题过于复杂,无法处理,请直接上报CEO";
}
}
四.测试验证
4.1测试验证类
@Slf4j
public class ChainMain {
public static void main(String[] args) {
VerifyService verifyService = new CommissionerVerify("10001", "三弟张翼德", "easy")
.setNext(new ForemanVerify("1001", "二哥关云长", "middle")
.setNext(new ManagerVerify("101", "大哥刘玄德", "difficult")));
String resultDifficult = verifyService.verify("100", "测试", "difficult");
log.info("测试结果:{}", resultDifficult);
System.out.println();
String resultMiddle = verifyService.verify("10001", "测试123", "middle");
log.info("测试结果:{}", resultMiddle);
System.out.println();
String resultEasy = verifyService.verify("9999", "测试999", "easy");
log.info("测试结果:{}", resultEasy);
System.out.println();
String resultOther = verifyService.verify("10001", "测试123", "other");
log.info("测试结果:{}", resultOther);
}
}
4.2验证结果
00:49:41.170 [main] INFO com.microsoft.designpatten.chain.CommissionerVerify - 客服专员无法处理,流转到客服领班
00:49:41.174 [main] INFO com.microsoft.designpatten.chain.ForemanVerify - 客服领班无法处理,流转到客服经理
00:49:41.175 [main] INFO com.microsoft.designpatten.chain.ManagerVerify - 客服经理id:101,名称:大哥刘玄德,处理成功, it is so difficult
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.ChainMain - 测试结果:success
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.CommissionerVerify - 客服专员无法处理,流转到客服领班
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.ForemanVerify - 客服领班id:1001,名称:二哥关云长,处理成功, it is so middle
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.ChainMain - 测试结果:success
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.CommissionerVerify - 客服专员id:9999,名称:测试999,处理成功, it is so easy
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.ChainMain - 测试结果:success
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.CommissionerVerify - 客服专员无法处理,流转到客服领班
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.ForemanVerify - 客服领班无法处理,流转到客服经理
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.ManagerVerify - 客服经理无法处理,直接gg
00:49:41.176 [main] INFO com.microsoft.designpatten.chain.ChainMain - 测试结果:error:
此类问题过于复杂,无法处理,请直接上报CEO
Process finished with exit code 0
以上是关于设计模式责任链模式之模拟工单流转的主要内容,如果未能解决你的问题,请参考以下文章