美文网首页javase
[学习笔记]Java链式调用(方法链)-建造者模式

[学习笔记]Java链式调用(方法链)-建造者模式

作者: Alola_ | 来源:发表于2019-01-08 15:28 被阅读0次

    链式调用:chained invocation(链式调用)或者Method chaining,这种风格的API设计叫做fluent API或者Fluent interface,常用于Builder Pattern(建造者模式)
    本质就是在方法里面返回对象/其他来实现连续的调用。

    优点 编程性强 、可读性强、代码简洁。

    缺点 不太利于代码调试 (一点是因为想看某个方法的返回值时无法debug,还有一点是异常处理不方便)。

    网上看了一下别人的文章、问答,发现了很多很好的想法和科普,整理了一下,记录自己的学习

    实现方式

    一、基础版

    和日常的Java Bean不同的是,set方法里面多了个return this,使得我们可以多次调用自己类的实例方法。

    public class OperateLog {
        private int id;
        private String action;
        private String opreator;
        private String content;
        private Date time;
        public OperateLog setId(int id) {
            this.id = id;
            return this;
        }
        public OperateLog setAction(String action) {
            this.action = action;
            return this;
        }
        public OperateLog setOpreator(String opreator) {
            this.opreator = opreator;
            return this;
        }
        public OperateLog setContent(String content) {
            this.content = content;
            return this;
        }
        public OperateLog setTime(Date time) {
            this.time = time;
            return this;
        }
        public int getId() {  return id;  }
        public String getAction() {  return action;  }
        public String getOpreator() {  return opreator;  }
        public String getContent() {  return content;  }
        public Date getTime() {  return time;  }
    }
    
    二、建造者模式

    替代多参数构造函数的建造者模式。
    考虑到线程安全等问题,OperateLog里面的属性都为final,且构造函数为private,只能作为私有构造方法被Builder调用,不开放给外部。
    附上大神整理的建造者模式的介绍与实例。

    public class OperateLog {
        // 真正的属性都是不可变的
        private final int id;
        private final String action;
        private final String operator;
        private final String content;
        private final Date time;
    
        // 私有构造方法,只被 Builder 类调用
        private OperateLog(Builder builder) {
            this.id = builder.id;
            this.action = builder.action;
            this.operator = builder.operator;
            this.content = builder.content;
            this.time = builder.time;
        }
    
        public static class Builder {
            //必须参数
            private int id;
            private String action;
            private Date time;
    
            // 可选参数
            private String content = "";
            private String operator;
    
            public Builder(int id, String action, Date time) {
                this.id = id;
                this.action = action;
                this.time = time;
            }
            //使用设置好的参数值新建 OperateLog 对象
            public OperateLog build(){
                return new OperateLog(this);
            }
    
            // 每个 setter 方法都返回当前的对象,做到链式调用
            public Builder setContent(String content) {
                this.content = content;
                return this;
            }
    
            public Builder setOperator(String operator) {
                this.operator = operator;
                return this;
            }
        }
    }
    

    调用

    new OperateLog.Builder(1,"插入",new Date()).setContent("插入新记录").build();
    //建造者模式只有在调用build()之后才会创建OperateLog对象。
    

    PS:idea在生成Setter时自带一个builder模版可以生成带 return this 的setter。


    image.png

    相关文章

      网友评论

        本文标题:[学习笔记]Java链式调用(方法链)-建造者模式

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