设计模式责任链模式之模拟工单流转

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

以上是关于设计模式责任链模式之模拟工单流转的主要内容,如果未能解决你的问题,请参考以下文章

扎实基础_设计模式_行为型_责任链模式

php设计模式之责任链模式实现举报功能实例代码

设计模式之责任链模式

设计模式----责任链模式

设计模式之责任链模式20170717

JAVA设计模式之责任链模式