假设我已经实现了课程Dog
:
public class Dog {
private String breed;
private Set<Colour> colours;
}
我还实现了一个函数来解析外部文件中有关可用狗的信息。之后,我收集了Dog
个对象(例如杜宾犬,奇瓦瓦犬,哈士奇犬,金色)。在每只狗中,有品种的名称和每种品种的一组可用颜色(例如金色:黄色,肉桂粉,白色)。
此外,我想让用户创建House
个对象。每个House
可能包含Dog
作为属性,但我想限制选项,因此用户必须只能创建我的集合中指定的狗。用户不能创建“约克郡”或“比格犬”,也不能创建绿色或蓝色的吉娃娃。
我应该使用哪种策略或dessign模式?
额外:我正在开发一个库(或框架,目前尚不清楚)。我的任务是提供一个API,用户可能需要的一系列功能。
答案 0 :(得分:3)
我会将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
}