需求是要post请求获取一个对象,对象里有很多的属性,之前的做法是将值一个个获取后,再塞入到对象中,这样的话代码就会显得很臃肿
伪代码如下:
Pojo pojo = new Pojo();
//复杂的查询条件构建
Criteria criteria1 =...;
Group group = Groupdao.search(criteria1);
//处理查询结果
doSomothingWithGroup(group);
//设入值
pojo.setGroup(group);
//以下类似上面的逻辑
Account account = Accountdao.search(criteria2);
pojo.setAccount(account);
...
pojo.setEnquiryDetail();
pojo.setFixedDepositsDetail();
pojo.setTransactionAccess();
...
上面的代码里各种set操作,都是先查数据后处理数据,将处理后的数据设入pojo。这些逻辑都放在一个类里,很不直观,可以使用建造者模式来改造。公司代码不便于展示,这里写了个BuilderDemo演示。
public class BuilderDemo {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BuilderDemo(){}
public static class builder{
private BuilderDemo target;
public builder(){
target = new BuilderDemo();
}
public builder setName(String name){
target.setName(name);
return this;
}
public builder setId(int id) {
target.setId(id);
return this;
}
public BuilderDemo build(){
return target;
}
使用如下,实现了链式编程
new BuilderDemo.builder().setName("ls").setId(1).build();
但是如果BuilderDemo有变了, BuilderDemo.builder也要跟着变化。。例如增加了一个简单的属性age
BuilderDemo {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static class builder{
//builder必须要增加
public builder setAge(int age) {
target.setAge(age);
return this;
}
}
}
而使用jdk 8 的Consumer实现后,则builder不需要再增加代码
public static class builder{
public builder set(Consumer<BuilderDemo> consumer){
consumer.accept(target);
return this;
}
}
使用如下
new BuilderDemo.builder().setName("ls").setId(1).set(target->target.setAge(20)).build();
一些复杂的查询设置就可以通过写成单独方法实现,例如BuilderDemo里增加了一个map属性
public class BuilderDemo {
private Map map ;
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
}
使用如下
//复杂的操作写成一个方法
new BuilderDemo.builder().setName("ls").setId(1).set(target->target.setAge(20)).set(target->target.setMap(complicatedMap()))
.build();
private static Map complicatedMap(){
Map m = new HashMap();
m.put("1",1);
m.put("2",2);
//...
return m;
}