我正在空闲时间制作一个小型游戏应用程序,而我最近才碰壁。
我们的想法是有一个Box
可用的固定网格,以及许多Jewel
。
盒子和珠宝都可以有不同的颜色。与色彩空间一样,三种基本类型的盒子是红色,黄色和蓝色。其他可用的当然是橙色,紫色,绿色,带有一个特殊的白色盒子。
我也有珠宝,它们与盒子颜色相同。
现在,逻辑如下:
我对如何为此制作域模型感到困惑,因此它不包含(或尽可能少地包含)if
和instanceof
s。
此外,如果我想延长盒子和珠宝的类型,我希望通过添加新类而不必更改旧类,可以通过以下两种方式完成。
答案 0 :(得分:1)
我想你可以有这样的东西:
public enum Color {
RED(true),
YELLOW(true),
BLUE(true),
ORANGE(false),
PURPLE(false),
GREEN(false),
WHITE(false);
static {
ORANGE.components.add(RED);
ORANGE.components.add(YELLOW);
PURPLE.components.add(RED);
PURPLE.components.add(BLUE);
GREEN.components.add(YELLOW);
GREEN.components.add(BLUE);
WHITE.components.add(RED);
WHITE.components.add(YELLOW);
WHITE.components.add(BLUE);
}
private boolean primary;
private List<Color> components;
Color(boolean primary) {
this.primary = primary;
this.components = new ArrayList<Color>();
}
public boolean isPrimary() {
return primary;
}
public Set<Color> components() {
return Collections.unmodifiableSet(this.components);
}
}
然后你可以这样:
public class Jewel {
private Color color;
...
}
public class Box {
private Color color;
private Jewel jewel;
...
}
所有分数计算都可以在某种评分服务中完成:
public class ScoringService {
public int calculate(Box box) {
int score = 0;
Jewel jewel = box.getJewel();
if(box.getColor() == jewel.getColor() || box.getColor() == Color.WHITE) {
score++;
}
if(!box.getColor().isPrimary() && jewel.getColor() == Color.WHITE) {
score++;
}
if(box.getColor().isPrimary() && !jewel.getColor().isPrimary()) {
Set<Color> intersection = new HashSet<Color>(box.getColor().components());
intersection.retainAll(jewel.getColor().components());
score += intersection.size();
}
return score;
}
}