美文网首页Design Pattern
如何优化审批流(责任链模式结合建造者模式)

如何优化审批流(责任链模式结合建造者模式)

作者: 奋斗的韭菜汪 | 来源:发表于2020-06-12 10:48 被阅读0次

责任链适用于以下应用场景:
1、 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定;
2、 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;
3、可动态指定一组对象处理请求。

常用实际场景:如审批流,
源码中使用责任链的场景:1、Netty中非常经典的串行化处理Pipeline就采用了责任链设计模式,2、Filter类
原始代码
用户信息

public class UserInfo {
    private String userName;
    private String roleName;
    private String phoneNum;
    private String code;
    public String getUserName() {
          return userName;
    }
    public void setUserName(String userName) {
          this.userName =userName;
    }
     public String getPhoneNum() {
           return phoneNum;
    }
     public void setPhoneNum(String phoneNum) {
          this.phoneNum =phoneNum;
    }
    public String getCode() {
          return code;
    }
    public void setCode(String code) {
        this.code =code;
    }
    public String getRoleName() {
          return roleName;
    }
     public void setRoleName(String roleName) {
          this.roleName =roleName;
    }
}

管理员登录模拟

public class LoginService {
    public void login(String phoneNum, String code){
        /***
         * 1、手机验证码校验
         */
        Boolean checkResult = codeCheck(phoneNum, code);
        if (!checkResult){
            System.out.println("手机验证码不正确!");
            return;
        }
        System.out.println("手机验证码没问题,继续执行...");
        /***
         * 2、用户是否存在
         */
        UserInfo userInfo = checkExists(phoneNum);
        if(null == userInfo){
            System.out.println("用户不存在");
            return;
        }
        System.out.println("用户存在,继续执行...");
        /***
         * 3、用户是否是管理员
         */
        if(!"管理员".equals(userInfo.getRoleName())){
            System.out.println("用户不是管理员,没有操作权限");
            return;
        }
        System.out.println("有权限操作");
    }
    private UserInfo checkExists(String phoneNum) {
        //默认存在
        UserInfo userInfo = new UserInfo();
        userInfo.setPhoneNum(phoneNum);
        userInfo.setRoleName("管理员");
        return userInfo;
    }
    private Boolean codeCheck(String phoneNum, String code) {
        if("6666".equals(code)){
            return true;
        }
        return false;
    }
}

测试

public class Test {
    public static void main(String[] args) {
        LoginService loginService = new LoginService();  loginService.login("18966669999","6666");
    }
}

执行结果:


QQ截图20200612112930.png QQ截图20200612113008.png

责任链模式优化后的代码
抽象处理者handler(定义一个请求处理的方法,并维护一个下一个处理节点Handler对象的 引用;)

public abstract class Handler {
    protected  Handler chain;
    public void next(Handler handler){
        this.chain = handler;
    }
    public abstract void doHandler(UserInfo userInfo);
}

具体处理者handler(对请求进行处理,如果不感兴趣,则进行转发。)

public class CodeCheckHandler extends Handler{
    @Override
    public void doHandler(UserInfo userInfo) {
        if (!"6666".equals(userInfo.getCode())){
            System.out.println("手机验证码不正确!");
            return;
        }
        System.out.println("手机验证码没问题,继续执行...");
        chain.doHandler(userInfo);
    }
}
public class CheckExistsHandler extends Handler{
    @Override
    public void doHandler(UserInfo userInfo) {
        //默认存在
        if(null == userInfo){
            System.out.println("用户不存在");
            return;
        }
        System.out.println("用户存在,继续执行...");
        userInfo.setRoleName("管理员");
        chain.doHandler(userInfo);
    }
}
public class AuthHandler extends Handler{
    @Override
    public void doHandler(UserInfo userInfo) {
        /***
         * 3、用户是否是管理员
         */
        if(!"管理员".equals(userInfo.getRoleName())){
            System.out.println("用户不是管理员,没有操作权限");
            return;
        }
        System.out.println("有权限操作");
    }
}
public class LoginService {
    public void login(String phoneNum, String code){
        UserInfo userInfo = new UserInfo();
        userInfo.setPhoneNum(phoneNum);
        userInfo.setCode(code);
                Handler codeCheckHandler = new CodeCheckHandler();
        Handler checkExistsHandler = new CheckExistsHandler();
        Handler authHandler = new AuthHandler();      codeCheckHandler.next(checkExistsHandler);       checkExistsHandler.next(authHandler);        codeCheckHandler.doHandler(userInfo);
    }
}

代码执行结果相同;

结合建造者模式继续优化(实现链式编程,让代码更优雅)

public abstract class Handler<E> {
    protected  Handler chain;
    public void next(Handler handler){
        this.chain = handler;
    }
    public abstract void doHandler(UserInfo userInfo);
    public static class Builder<E>{
        private Handler<E> head;
        private Handler<E> tail;
        public Builder<E> addHandler(Handler<E> handler){
            if (this.head == null){
                this.head = this.tail = handler;
                return this;
            }
            this.tail.next(handler);
            this.tail = handler;
            return this;
        }
        public Handler<E> build(){
            return this.head;
        }
    }
}
public class LoginService {
    public void login(String phoneNum, String code){
        UserInfo userInfo = new UserInfo();
        userInfo.setPhoneNum(phoneNum);
        userInfo.setCode(code);
        //链式编程
        Handler.Builder builder = new Handler.Builder();
        builder.addHandler(new CodeCheckHandler())
                .addHandler(new CheckExistsHandler())
                .addHandler(new AuthHandler());
        builder.build().doHandler(userInfo);
//        Handler codeCheckHandler = new CodeCheckHandler();
//        Handler checkExistsHandler = new CheckExistsHandler();
//        Handler authHandler = new AuthHandler();
//
//        codeCheckHandler.next(checkExistsHandler);
//        checkExistsHandler.next(authHandler);
//
//        codeCheckHandler.doHandler(userInfo);
    }
}

总结:责任链模式,符合单一职责原则,实现了解耦,客户只需将请求发送到链上即可,无需关心请求的具体内容 和处理细节,请求会自动进行传递直至有节点对象进行处理

相关文章

  • 责任链模式实战

    相关关联:如何优化审批流(责任链模式结合建造者模式);[https://www.jianshu.com/write...

  • 如何优化审批流(责任链模式结合建造者模式)

    责任链适用于以下应用场景:1、 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定;2、 在不明...

  • 一篇文章搞懂设计模式

    目录 面向对象的七种设计原则建造者模式命令模式享元模式模板方法模式责任链模式建造者模式原型模式观察者模式策略模式与...

  • 高仿okhttp手写责任链模式

    okhttp使用的设计模式面试的时候经常被问到,其中里面最多的建造者模式和责任链模式其中责任链模式也是okhttp...

  • 建造者模式,责任链模式

    建造者模式 将类的属性模块化,从而方便创建一个复杂的对象。 责任链模式 可以将责任链设计模式想象成链条,链条的每个...

  • OkHttp网络框架源码理解分析

    涉及到的设计模式 单例设计模式 建造者设计模式 责任链设计模式 ... OkHttp同步请求 发送请求后,UI线程...

  • 设计模式之责任链模式(Chain of Responsibili

    引入责任链模式 责任链模式的实例 责任链模式的分析 责任链模式的优势 责任链模式的应用 引入责任链模式 责任链模式...

  • 设计模式用例(四)

    责任链模式 Builder模式 观察者/中介模式

  • Javascript 设计模式

    创建型模式 工厂模式 建造者模式 行为模式 中介者模式 职责链模式 观察者模式 工厂模式 描述: 通过不同的typ...

  • Builder Pattern in Java

    建造者模式:建造者模式定义建造者模式应用场景实现案例Jdk中的建造者模式建造者模式的优点建造者模式的缺点 建造者模...

网友评论

    本文标题:如何优化审批流(责任链模式结合建造者模式)

    本文链接:https://www.haomeiwen.com/subject/fllgtktx.html