美文网首页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链式调用(方法链)-建造者模式

    链式调用:chained invocation(链式调用)或者Method chaining,这种风格的API设计...

  • 你一定不知道的链式调用新姿势

    如何链式调用Java静态方法? 链式调用 首先需要提一下最近几年在开发界大的链式调用,链式调用非常利于编写,更利于...

  • 一篇文章搞懂设计模式

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

  • 建造者模式-链式赋值

    当参数多的时候可以使用建造者模式做链式赋值

  • java建造者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java单例模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java外观模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java适配器模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java观察者模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

  • java代理模式

    其他设计模式java单例模式java建造者模式java策略模式java代理模式java观察者模式java适配器模式...

网友评论

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

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