实际应用-建造者模式和jdk8 consumer结合

本文介绍了一种利用Builder模式与Java 8的Consumer接口简化对象构建的方法,通过链式编程和灵活的参数设置,使代码更简洁、直观。文章展示了如何处理复杂的对象构建过程,并提供了一个具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求是要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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值