是否存在强制初始化子类实现方法的设计模式?

时间:2014-01-23 15:35:35

标签: java design-patterns

我正在尝试在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()。

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

2 个答案:

答案 0 :(得分:1)

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

希望这有帮助,史蒂夫。

答案 1 :(得分:0)

我认为你可以使用'Builder',它是用来避免拥有许多不同构造函数的创建模式。 我的意思是从对象中初始化对象。为此目的使用Builder类。