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

标签 java domain-model color-space

我正在利用空闲时间制作一个小游戏应用程序,但最近遇到了困难。

这个想法是有一个固定的Box网格可用,还有许多Jewel

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

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

现在,逻辑如下:

  • 原色盒子只有在包含与盒子颜色相同或由盒子颜色制成的 gem 时才会给予奖励
    • 例如,如果红色盒子里面有红色、橙色或紫色的 gem ,就会给予奖励,因为以下原因
      • 红色是由红色制成的
      • 橙色是由红色和黄色组成的
      • 紫色是由红色和蓝色组成的
      • 白色是由红、蓝、黄组成的
    • 红色盒子不会为绿色 gem 提供任何奖励,因为绿色是蓝色和黄色,里面没有红色
  • 二次色盒不能接受任何原色 gem ,因为二次色盒至少由两种颜色制成,而原色 gem 仅由一种颜色制成。
    • 鉴于此,辅助色盒只能接受相应颜色的 gem ,加上白色的 gem 。
  • 作为上述规则的一个异常(exception),白盒就像一个奖金盒,可以容纳所有珠宝

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

此外,如果有一天我想扩展盒子和珠宝的类型,我希望通过添加新类而无需更改旧类,通过以下两种方式中的任何一种来完成。

最佳答案

我想你可以有这样的东西:

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

关于java - 具有多个属性的对象的域模型问题。我应该如何构建它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838282/

相关文章:

java - Robotium - 试图点击应用程序中的主页按钮

java - 如何立即强制终止 ThreadPoolExecutor 中的所有 worker

c# - 在 DDD 中拥有独立的领域模型和持久性模型

mvvm - 域模型与 "Business Logic"混淆

android - 色差atan和atan2结果差异

PDF:什么是 DeviceRGB?

java - 从 Waffle/Pico 转换为 Struts2/Guice

java - eclipse中如何进行代码格式切换?

javascript - 忘记使用良好的域模型进行服务器端表单验证?

image - YCbCr 颜色空间中的蓝差和红差色度分量是什么意思?