两个对象的双向依赖

问题描述 投票:3回答:1

背景

我有以下内容:

class Fire extends Element,

class Wood扩展元素,

复合Element的class Tile。

Tile类表示世界/屏幕/画布中的图块,并且其中包含一些图形和逻辑功能。它合成了一个Element对象,因为“world”中的每个tile都是由某种实体(= element)组成的。

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

“世界”被初始化为由Wood元素组成的图块网格,除了一个具有应该传播的Fire元素的图块。

我做了什么

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

我已经尝试将整个功能移动到Tile类。虽然它确实解决了这个问题,但我不喜欢它有两个原因:

  1. 从逻辑上讲,我希望火能够自动行动,这意味着火是扩散的,而不是瓷砖。
  2. 因此,Tile类有许多只与fire相关的方法(例如spread()),这需要我检查 - “这个tile是否由fire元素组成?”,这是不好的做法。

代码示例

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. 瓦片的“网格”由二维Tiles数组(逻辑部分)和由所有瓦片(视觉部分)组成的JavaFx窗格组成。
  2. 当火焰触及邻居瓷砖并将其从Wood变为Fire时,火势会“蔓延”。当火焰消耗(=变为射击)给定的木材阈值时,火势不再蔓延,例如:在它消耗了30块木头之后。从某种意义上说,火可以跟踪它消耗的木材。

提前致谢!

java oop class-design bidirectional-relation
1个回答
2
投票

我的想法是应该有一个管理火势蔓延的课程。让我们说,有一个World类,一个知道瓷砖网格及其性质的类。 FireWood,它的位置及其邻居一无所知。 Wood也是如此。它们是生活的独立物品。 World决定他们居住的地方以及他们如何互相交流。

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

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

World接收消息,考虑火灾的特征,并相应地修改网格。

好。有了火的强度/高度/ [任何其他特征],这个和这个Wood元素将被烧毁。我将用新的Fire实例替换它们(或者我将复制现有的Fire对象并将其引用到预期要烧制的单元格中)。

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

Fire(Fire current, Elements... newlyTakenElements)

虽然,你可以自由地找出自己的方式来记录它。

通过这种方式,您可以在火灾结束时(完全或部分)恢复细胞。您还可以分析火灾的发展方式。我不确定这是否会派上用场,但它的设计非常吸引人。


我正在考虑替代方案......我仍然认为向Fire提供太多信息(整个瓷砖地图)不是一种可行的方式,WoodFire细胞之间的任何相互作用都应该通过经理类。

看看另一个场景,它表明World提供了一个局部视图,将其视为与火元素相邻的列表。

- 我想要传播。

-好。这是相邻可燃元素的列表。我不知道你的特点。由您来决定要燃烧多少个细胞(以及哪些细胞)。

- 我把它们全部烧掉了。给我多一点!

世界给出了另一个清单,直到火灾满足为止。

© www.soinside.com 2019 - 2024. All rights reserved.