【发布时间】:2015-09-23 13:04:25
【问题描述】:
我阅读并喜欢 Lukas Eder 的文章 http://blog.jooq.org/2012/01/05/the-java-fluent-api-designer-crash-course/,我想为一个类创建一个 Fluent 接口。
该类有四个函数(“words”fill1 到 fill4)允许设置对象属性和四个函数(“words”get1 到 get4)获取这些属性,但前提是设置了所需的属性:
首先我必须填写基本设置(fill1)。之后,我可以得到一些字符串设置(get1 到 get3)。或者我可以填写更多信息(fill2 到 fill4)。但只有在 每个 fill2 到 fill4 被调用至少一次 之后,才能调用最终的 get4。我该怎么做?
第一张图(状态是黑点)显示了我想要做什么,但是你可以看到 ?标记不清楚的部分,因为如果在第一个图中保持原样,即使仅调用了 fill2 到 fill4 中的一个,它也允许调用 get4。
第二个图将强制每个 fill2 到 fill4 已被调用,但会强制执行顺序并限制如果我想更改例如fill3,我还要重新设置 fill2 和 fill4。
最后一张图可以做我想做的事,但它有 13 个状态!现在,如果我想我只是在填充 2 到填充 4 的组中再添加一个属性,那么状态的数量会爆炸得更多。
编辑:另外,在考虑了更多之后,我注意到我这样做的方式(见下文)甚至无法实现最后一个图表,因为在 fill2被调用时,我们可能处于不同的状态 - 取决于之前发生的事情。
我能/应该做什么?
编辑:我实现流畅的界面有点像外观(如果我的设计模式正确的话)。我的意思是:我几乎没有改变实际的类——返回这个(如在方法链接中),但是在方法签名中将各自的状态接口作为返回值。状态由嵌套接口表示。示例:
public class MyClass implements MyInterface.Empty, MyInterface.Full {
String stuff;
private MyClass(){};
public static MyInterface.Empty manufactureNewInstance(){
return new MyClass();
}
public MyInterface.Full fillStuff(String stuff){
this.stuff = stuff;
return this;
}
public String getStuff(){
return stuff;
}
}
public interface MyInterface {
public interface Empty {
public MyInterface.Full fillStuff();
}
public interface Full {
public String getStuff();
}
}
public class MyMain {
pulic static void main(String[] args) {
// For explaination:
MyClass.Empty myclassEmpty = MyClass.manufactureNewInstance();
MyClass.Full myclassFull = myclassEmpty.fillStuff("Hello World 1!");
String result1 = myclassEmpty.getStuff();
// As fluent chaining:
String result2 = MyClass.manufactureNewInstance()
.fillStuff("Hello World 2!")
.getStuff();
}
}
【问题讨论】:
标签: java fluent-interface