具有多个属性的对象的域模型问题。我应该如何构建它?

时间:2013-07-24 15:20:27

标签: java domain-model color-space

我正在空闲时间制作一个小型游戏应用程序,而我最近才碰壁。

我们的想法是有一个Box可用的固定网格,以及许多Jewel

盒子和珠宝都可以有不同的颜色。与色彩空间一样,三种基本类型的盒子是红色,黄色和蓝色。其他可用的当然是橙色,紫色,绿色,带有一个特殊的白色盒子。

我也有珠宝,它们与盒子颜色相同。

现在,逻辑如下:

  • 原色框只有在含有颜色与盒子颜色相同或由盒子颜色制成的宝石时才会给予奖励
    • 例如,如果红色,橙色或紫色的宝石由于以下原因,红色框会给予奖励
      • 红色由红色
      • 制成
      • 橙色由红色和黄色
      • 制成
      • 紫色由红色和蓝色制成
      • 白色由红色,蓝色和黄色制成
    • 红盒子不会给绿宝石任何奖励,因为绿色是蓝色和黄色,那里没有红色
  • 辅助颜色盒不能接受任何原色珠宝,因为辅助颜色盒由至少两种颜色制成,而主要宝石仅由1种颜色制成。
    • 鉴于此,二级彩盒只能接受相应的彩色宝石,再加上白色的宝石。
  • 作为上述规则的例外,白盒子就像一个奖励盒子,可以接受所有珠宝

我对如何为此制作域模型感到困惑,因此它不包含(或尽可能少地包含)ifinstanceof s。

此外,如果我想延长盒子和珠宝的类型,我希望通过添加新类而不必更改旧类,可以通过以下两种方式完成。

1 个答案:

答案 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;
    }
}