这有什么设计模式吗? (建造者,继承)

时间:2017-03-26 09:54:09

标签: inheritance design-patterns interface builder

我有以下结构:

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。

1 个答案:

答案 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;
        }

    }