假设我已经实现了Dog
类:
public class Dog {
private String breed;
private Set<Colour> colours;
}
我还实现了一个功能,可以从外部文件中解析有关可用狗的信息。之后,我有一个
Dog
对象的集合(例如,杜宾犬,奇瓦瓦州,沙哑,金黄色)。每只狗内都有品种的名称和每种品种的一组可用颜色(例如,金色:黄色,肉桂粉,白色)。此外,我想让用户创建
House
对象。每个House
可能包含一个Dog
作为属性,但是我想限制这些选项,因此用户必须只能创建我的集合中指定的狗。用户必须不能创建“约克郡”或“小猎犬”,也不能创建绿色或蓝色的吉娃娃。我应该使用哪种策略或设计模式?
另外:我正在开发一个库(或框架,目前尚不清楚)。我的任务是提供一个API,这是用户可能需要的一系列功能。
最佳答案
我将Breed
和实际Dog
的概念分开。知道允许的Breed
是Colour
的责任,而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
}