设计模式建造者模式:建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
1.创建要构建的对象
/**
* 视图
*
*<hr>
* @author hanjidong
* @date 2020年11月23日 上午11:07:02
* @since 0.0.1
*/
@Data
@Getter
@Setter
public class View {
/**
* 视图基本信息
*/
private SeReqView viewInfo;
/**
* 视图条件级
*/
private List<SeReqViewConditionGroup> group;
/**
* 视图字段关系表
*/
private List<SeReqViewAttrRela> viewRela;
}
2.创建builder抽象类
/**
* 抽象 builder 类
*
*<hr>
* @author hanjidong
* @date 2020年11月23日 上午11:18:03
* @since 0.0.1
*/
public abstract class Builder {
/**
* 创建视图基本信息
*
*<hr>
* @author hanjidong
* @date 2020年11月23日 上午11:18:17
* @since 0.0.1
* @param docId
* void
*/
public abstract void buildView(String docId);
/**
* 创建条件集基本信息
*
*<hr>
* @author hanjidong
* @date 2020年11月23日 上午11:18:25
* @since 0.0.1
* void
*/
public abstract void buildGroup();
/**
* 创建字段属性基本信息
*
*<hr>
* @author hanjidong
* @date 2020年11月23日 上午11:18:34
* @since 0.0.1
* void
*/
public abstract void buildAttrRela();
/**
* 创建视图
*
*<hr>
* @author hanjidong
* @date 2020年11月23日 上午11:18:45
* @since 0.0.1
* @return
* View
*/
public abstract View createView();
}
3.创建具体的builder的抽象类
/**
* 基础视图创建类
*
*<hr>
* @author hanjidong
* @date 2020年11月23日 上午11:07:39
* @since 0.0.1
*/
@Component
public class BaseBuilder extends Builder{
Log log = LogFactory.getLog(this.getClass());
View viewInfo = new View();
/**
* 创建视图信息 创建者默认system
*/
@Override
public void buildView(String docId) {
SeReqView view = new SeReqView();
viewInfo.setViewInfo(view);
}
/**
* 创建视图条件租
*/
@Override
public void buildGroup() {
SeReqView view = viewInfo.getViewInfo();
List<SeReqViewConditionGroup> groups = wrapGroups(view);
viewInfo.setGroup(groups);
}
/**
* 构建文档视图关系表
*/
@Override
public void buildAttrRela() {
SeReqView view = viewInfo.getViewInfo();
if(view == null){
log.info("buildAttrRela 创建文档视图属关系失败,没有默认的视图");
return ;
}
List<SeReqViewAttrRela> lstPo = new ArrayList<>();
wrapRelaAttr(view, lstPo);
relaDao.batchAdd(lstPo);
viewInfo.setViewRela(lstPo);
}
/**
*返回视图实体
*/
@Override
public View createView() {
return viewInfo;
}
}
4.创建调用者
/**
* 导演类
*
*<hr>
* @author hanjidong
* @date 2020年11月23日 上午11:05:40
* @since 0.0.1
*/
@Component
@Async
public class ViewDirector {
Log log = LogFactory.getLog(this.getClass());
/**
* 基础视图创建builder
*/
@Autowired
private BaseBuilder builder;
/**
* 把导演类中的createView()方法合并到抽象建造者类中
*
* @return 具体产品对象
*/
@Transactional
public View createView(String docId) {
builder.buildView(docId);
builder.buildGroup();
builder.buildAttrRela();
return builder.createView();
}
}
调用
@Componet
public class TestBuilder{
@Autowired
private ViewDirector viewDirector;
public void save() {
viewDirector.createView("aaa");
}
}