构建者模式,参考 go-elastic-client对象的构建,由于参数非常多而且后期会有比较大的变动的可能
正常的想法:
function build(a,b,c,d,e,f,g,h,i,j...)
function build(a,b,c,...)
function build(a,b,...)
随着参数的增多 builder方法会一直增多
并且可变参总是不够灵活,有时候需要2个或者更多个可变参数
优雅一些的写法:
package com.example.one.po; import lombok.Data; @Data public class LoggerDetail { private String userName; private String userIp; private String level; public static LoggerDetail builder(String userName,OptionFunc ...optionFunc){ LoggerDetail loggerDetail = new LoggerDetail(); loggerDetail.setUserName(userName); for (OptionFunc func : optionFunc) { func.set(loggerDetail); } return loggerDetail; } }
定义的接口:
package com.example.one.po; public interface OptionFunc { void set(LoggerDetail loggerDetail); }
后续就是不断的实现 OptionFunc 进行扩充参数
level :
package com.example.one.po; public class SetLevel implements OptionFunc{ private String level; @Override public void set(LoggerDetail loggerDetail) { loggerDetail.setLevel(level); } public SetLevel(String level){ this.level = level; } }
userIp
package com.example.one.po; public class SetUserIp implements OptionFunc{ private String userIp; @Override public void set(LoggerDetail loggerDetail) { loggerDetail.setUserIp(userIp); } public SetUserIp(String userIp){ this.userIp = userIp; } }
调用的方式:
@Test public void TestLoggerDetail (){ LoggerDetail loggerDetail = LoggerDetail.builder( "jack", new SetUserIp("127.0.0.1"), new SetLevel("warn") ); System.out.println(loggerDetail); }