【问题标题】:Is there a design pattern to force initialization of a subclass implemented method?是否有强制初始化子类实现方法的设计模式?
【发布时间】:2014-01-23 15:35:35
【问题描述】:

我正在尝试在 Java 中创建一个抽象类,其中一部分创建涉及调用子类需要实现的初始化方法。我希望子类可以访问抽象类不需要知道的任意参数。

这里有一些代码让它更清楚:

public abstract class NormalizedRandom<T> {

    private Queue<T> randomList;
    private List<T> usedRandomsList;

    public NormalizedRandom() {
        randomList = new LinkedList<T>();
        usedRandomsList = new ArrayList<T>();
        init();
        shuffleList();
    }

    protected abstract void init();

    ...

}

public class NormalizedRandomIntegerRange extends NormalizedRandom<Integer> {

    private int min;
    private int max;
    private int repeats;

    public NormalizedRandomIntegerRange(int min, int max, int repeats) {
        this.min = min;
        this.max = max;
        this.repeats = repeats;
    }

    @Override
    protected void init() {
        for(int num = min; num <= max; num++) {
            for(int i = 0; i < repeats; i++) {
                super.addRandomOutcome(num);
            }
        }
    }
}

显然这是行不通的,因为在初始化参数之前需要调用 super()。

这类问题看起来必须有一些简单的设计模式来解决它。我只是想不出解决问题的正确方法。

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    尝试将初始化部署到自己的类或接口中,即 子类必须提供超类作为构造函数的参数。 现在您可以轻松切换和重新定义 init 方法和 在子类代码运行之前,超类可以自己调用它。 initStrategy 可以使用不知道的参数初始化 超类。我会使用一个界面。 (我想你已经知道了,但它是一种策略模式)。

    希望这会有所帮助,史蒂夫。

    【讨论】:

    • 这正是我想要的解决方案。在考虑了更多之后,我实际上意识到我过度设计了这个问题。层次结构实际上并不需要那么灵活:我实际上只是要在子类构造函数中进行初始化,如果以后创建更多子类,只需要记住这样做。
    【解决方案2】:

    我认为您可以使用“Builder”,这是一种用于避免使用许多不同构造函数的创建模式。 我的意思是从构造器中获取对象的初始化。为此目的使用构建器类。

    【讨论】:

    • Builder 不能像我想的那样工作,因为它为问题增加了额外的间接层。我希望子类能够直接定义其初始化,这是 JacksOnF1re 建议的策略模式能够做到的。
    猜你喜欢
    • 2018-04-01
    • 2018-05-12
    • 2015-10-27
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多