两个对象的双向依赖性

时间:2019-04-22 19:46:51

标签: java oop class-design bidirectional-relation

背景

我有以下内容:

类火灾扩展元素,

类伍德延伸元素,

组成元素的Tile类。

Tile类表示世界/屏幕/画布中的图块,并具有一些图形和逻辑功能。 它合成了Element对象,因为“世界”中的每个图块都是由某种物质(=元素)组成的。

我想实现火势蔓延的功能-当火元素“接触”木元素时,我希望木元素成为火。 从逻辑上讲,这应该在fire元素内完成,但是这样做,我无法更改给定Tile的元素(例如,从Wood更改为Fire)。

“世界”被初始化为由Wood元素组成的瓷砖网格,但其中一个具有Fire元素的瓷砖应被散布。

我尝试过的内容

我尝试将元素链接在一起,这意味着每个元素都可以访问他的四个最近的邻居。这样,火可以进入附近的一块木头。 这不能解决在火接触到木头时更改Tile的元素类型的问题。

我尝试将整个功能移到Tile类。尽管它确实可以解决问题,但由于两个原因,我不喜欢它:

  1. 从逻辑上讲,我希望火势能够自主行动,这意味着是蔓延的,而不是 tile

  2. 因此,Tile类具有许多仅与火相关的方法(例如spread()),这需要我检查-“此tile是否由火元素组成?”,这很糟糕练习。

代码示例

class Fire extends Element{
    public void spread(){
        // Move to all four neighbors and turn them into Fire elements
    }
}

class Wood extends Element{
}

class Tile{
    private Element _element;

}

深度

  1. 图块的“网格”由二维图块数组(逻辑部分)和由所有图块组成的JavaFx窗格(可视部分)组成。

  2. 当火接触到相邻的瓦片并将其从“木材”转换为“火”时,会“蔓延”。当消耗(=转换为火)给定的木材阈值时,火停止蔓延。它消耗了30块木头之后。从某种意义上说,火可以追踪消耗的木材。

谢谢!

1 个答案:

答案 0 :(得分:2)

我立即想到应该有一个班级来管理火势蔓延。假设有一个World类,该类了解磁贴的网格及其性质。 FireWood,其位置和邻居一无所知。 Wood也是如此。它们是生活的独立对象。 World可以决定它们的位置以及它们如何相互作用。

让我们想象Fire发布一个事件并告诉

  

我想传播。这是我想占用的位置。我的身高/强度/频率/我的[火的其他特征]是...“

World收到消息,考虑到火的特性,并相应地修改了网格。

  

好。在这种强度/高度/ [任何其他特征]的情况下,这个Wood元素将被燃烧。我将用新的Fire实例替换它们(或者我将复制现有的Fire对象并将其引用放入预期要刻录的单元格中。)

拥有一个Fire实例并跟踪其燃烧的所有元素会很有趣。我可以看到复制构造函数的修改版本。

Fire(Fire current, Elements... newlyTakenElements)

不过,您可以自由地以自己的方式记录它。

这样,当火势结束时,您将能够(全部或部分)恢复细胞。您还可以分析火势如何发展。我不确定这是否会派上用场,但是设计很有趣。


我正在考虑替代方案...我仍然认为向Fire提供过多信息(整个图块)不是一种可行的方法,Wood和{{ 1}}单元格应该经过manager类。

看看另一种场景,该场景建议Fire提供其自身的部分视图,作为与fire元素相邻的列表。

  

-我想传播。

     

-确定。这是相邻可燃元素的列表。我不知道你的特征。由您决定要烧多少个电池(和哪个)。

     

-我已经全部烧光了。给我更多!

     

在火势蔓延之前,世界会给出另一个清单。