行为性模式-责任链模式

责任链模式的核心是解决一组服务中的先后执行处理关系,就有点像你没钱花了,需要家庭财务支出审批,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 审批人:段总"}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值