假设我已经实现了Dog类:

public class Dog {
    private String breed;
    private Set<Colour> colours;
}


我还实现了一个功能,可以从外部文件中解析有关可用狗的信息。之后,我有一个Dog对象的集合(例如,杜宾犬,奇瓦瓦州,沙哑,金黄色)。每只狗内都有品种的名称和每种品种的一组可用颜色(例如,金色:黄色,肉桂粉,白色)。

此外,我想让用户创建House对象。每个House可能包含一个Dog作为属性,但是我想限制这些选项,因此用户必须只能创建我的集合中指定的狗。用户必须不能创建“约克郡”或“小猎犬”,也不能创建绿色或蓝色的吉娃娃。

我应该使用哪种策略或设计模式?

另外:我正在开发一个库(或框架,目前尚不清楚)。我的任务是提供一个API,这是用户可能需要的一系列功能。

最佳答案

我将Breed和实际Dog的概念分开。知道允许的BreedColour的责任,而Dog的构造函数必须确保品种和颜色匹配。

您可以将Breed设为一个枚举,以确保仅创建您所知道品种的狗:

public enum Breed {

    MYBREED(Color.BLACK, Color.GRAY),
    MYOTHERBREED(Color.GRAY);

    private List<Color> colors = new ArrayList<Color>();

    private Breed(Color...colors) {
        for(Color color: colors) {
            this.colors.add(color);
        }
    }

    public List<Color> getAllowedColors() {
        return colors;
    }

}


使用Java枚举的缺点是您无法在运行时动态生成它们。在这种情况下,您必须用一些手抓的解决方案代替它,例如使用multiton pattern

然后Dog类可以使用它:

public class Dog {

    private Breed breed;
    private Color color;

    public Dog(Breed breed, Color color) {
        if(!breed.getAllowedColors().contains(color)) {
            throw new IllegalArgumentException(breed + " must not be of color " + color);
        }
        this.breed = breed;
        this.color = color;
    }

    public Breed getBreed() {
        return breed;
    }

    public Color getColor() {
        return color;
    }

    // No setters for breed and color because they cannot change during a dog's lifetime

      //... some more things a dog can do

}

10-07 19:02
查看更多