builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。示例如下:
public static void main(String[] args) {
MetaVo metaVo = new MetaVo();
metaVo.setIcon("1")
.setTitle("2")
.setNoCache(true);
System.out.println(metaVo);
}
这种设计模式的精髓就主要有两点:其一,用户使用简单,并且可以在不需要知道内部构建细节的情况下,就可以构建出复杂的对象模型;其二,对于设计者来说,这是一个解耦的过程,这种设计模式可以将构建的过程和具体的表示分离开来。
Builder 模式创建步骤:
- 在类中,创建一个静态内部类,包含外部类的全部属性;
- 在内部类中,为每一个属性进行赋值;
- 内部类中创建 build 方法,返回外部类对象
- 在外部类中创建静态 builder方法,返回内部类对象
拿实体类举例就是创建一个实体类,然后呢,将你的set方法稍作改动,示例如下(已注释说明):
package com.pmtest.system.domain.vo;
import com.pmtest.common.utils.StringUtils;
/**
* 路由显示信息
*
* @author ppq
*/
public class MetaVo
{
/**
* 设置该路由在侧边栏和面包屑中展示的名字
*/
private String title;
/**
* 设置该路由的图标,对应路径src/assets/icons/svg
*/
private String icon;
/**
* 设置为true,则不会被 <keep-alive>缓存
*/
private boolean noCache;
/**
* 内链地址(http(s)://开头)
*/
private String link;
public MetaVo()
{
}
public MetaVo(String title, String icon)
{
this.title = title;
this.icon = icon;
}
public MetaVo(String title, String icon, boolean noCache)
{
this.title = title;
this.icon = icon;
this.noCache = noCache;
}
public MetaVo(String title, String icon, String link)
{
this.title = title;
this.icon = icon;
this.link = link;
}
public MetaVo(String title, String icon, boolean noCache, String link)
{
this.title = title;
this.icon = icon;
this.noCache = noCache;
if (StringUtils.ishttp(link))
{
this.link = link;
}
}
public boolean isNoCache()
{
return noCache;
}
//默认生成类型是void,将其修改为你的实体类名称,注意不要使用你的属性的修饰类型
public MetaVo setNoCache(boolean noCache)
{
this.noCache = noCache;
//然后在加上这个return this;结束
return this;
}
public String getTitle()
{
return title;
}
//默认生成类型是void,将其修改为你的实体类名称,注意不要使用你的属性的修饰类型
public MetaVo setTitle(String title)
{
this.title = title;
//然后在加上这个return this;结束
return this;
}
public String getIcon()
{
return icon;
}
//默认生成类型是void,将其修改为你的实体类名称,注意不要使用你的属性的修饰类型
public MetaVo setIcon(String icon)
{
this.icon = icon;
//然后在加上这个return this;结束
return this;
}
public String getLink()
{
return link;
}
//默认生成类型是void,将其修改为你的实体类名称,注意不要使用你的属性的修饰类型
public MetaVo setLink(String link)
{
this.link = link;
//然后在加上这个return this;结束
return this;
}
@Override
public String toString() {
return "MetaVo{" +
"title='" + title + '\'' +
", icon='" + icon + '\'' +
", noCache=" + noCache +
", link='" + link + '\'' +
'}';
}
}
将set方法的返回类型修改为实体类,在其方法内加入return this;实体类编辑完成,
属性赋值的时候就可以进行链式编辑:
public static void main(String[] args) {
MetaVo metaVo = new MetaVo();
metaVo.setIcon("1")
.setTitle("2")
.setNoCache(true);
System.out.println(metaVo);
}
当然现在大多数的实体类都采用lombok的@Data注解,这样使代码更加简洁,示例如下:
@Data
//需要加上这个注解
@Accessors(chain = true)
public class Menu extends Model<Menu> {
}
另外,常用的StringBuffer的append()方法,是不是觉的很相似,源码如下:
偶然阅读一篇文章,忽然想起了这个,记录下所得;