我有以下结构:
public class MyClass {
public static class DefaultBuilder {
private int config1;
private String config2;
public DefaultBuilder configMethod1(int config1){
this.config1 = config1;
return this;
}
public DefaultBuilder configMethod2(String config2){
this.config2 = config2;
return this;
}
}
public static class SpecialBuilder extends DefaultBuilder {
private long specialConfig1;
public SpecialBuilder specialConfigMethod1(long specialConfig1){
this.specialConfig1 = specialConfig1;
return this;
}
}
}
...
public class Main {
public static void main(String[] args){
new MyClass.DefaultBuilder().configMethod1(1).configMethod2("Test"); // Works great
new MyClass.SpecialBuilder().specialConfigMethod1(10).configMethod1(1).configMethod2("Test"); // Works great
new MyClass.SpecialBuilder().configMethod1(1).configMethod2("Test").specialConfigMethod1(10); // Does not work
}
}
我在使用它作为第一种方法时只能使用specialConfigMehthod1
。但是因为这应该是图书馆的API,我不想告诉用户他如何订购他的电话。此外,我不希望用户在使用specialConfigMethod1()
时可以致电DefaultBuilder
。我可以覆盖SpecialBuilder
中的每个方法,但我不喜欢那个解决方案,因为那时继承是没有意义的。我也考虑过接口,但没有找到任何好的解决方案。是否有任何设计模式或任何非常简单的我没有想到的(如果可能的话,在Java中):):
如果你想在一个有效的例子中看到这个,你可以去这里:GitHub 这是我的第一个开源库,我不喜欢它的API。
答案 0 :(得分:0)
我认为最好的方法是首先使用方法configMethod1(),configMethod2()和specialConfigMethod()定义接口Builder:
public interface Builder {
Builder configMethod1(int config1);
Builder configMethod2(String config2);
Builder specialConfigMethod1(long specialConfig1);
}
然后,您可以定义一个抽象类AbstractBuilder来定义接口中方法的一些默认实现。我认为最好看看你的问题:
public abstract class AbstractBuilder implements Builder{
private int config1;
private String config2;
@Override
public Builder configMethod1(int config1){
this.config1 = config1;
return this;
}
@Override
public Builder configMethod2(String config2){
this.config2 = config2;
return this;
}
}
最后,您定义了扩展AbsractBuilder的SpecialBuilder:
public class SpecialBuilder extends AbstractBuilder {
private long specialConfig1;
@Override
public Builder specialConfigMethod1(long specialConfig1){
this.specialConfig1 = specialConfig1;
return this;
}
}