避免带有图案的吸气剂链

mai*_*elm 2 java design-patterns law-of-demeter

我正在制作一个游戏,你必须要保卫一座城堡.每个级别都由车道组成,敌人进来并攻击它.现在,城堡对于每个级别都是相同的,如果它在级别1中被破坏,它将在第2级"生成"具有相同的健康点.所以我所做的就是在游戏开始时创建一个城堡对象,并将其保留在游戏的其余部分.

这是一个说明我的"设计":

在此输入图像描述

现在,当敌人到达城堡并损坏它时,我的代码如下所示:

this.getLane().getLevel().getGame().getCastle().doDamage(1);
Run Code Online (Sandbox Code Playgroud)

哪个看起来不是很好.我一直在寻找一些设计模式来提出一个更清洁的解决方案,但我并没有找到一个,并且想知道是否有人有想法.

(我知道这个问题是关于链接吸气剂的问题:https: //stackoverflow.com/questions/8744668/java-getter-chaining-bad-or-good 但它并没有真正提出解决方案)

Gil*_*anc 5

转换它的一种方法:

this.getLane().getLevel().getGame().getCastle().doDamage(1);
Run Code Online (Sandbox Code Playgroud)

对此:

this.doDamage(1);
Run Code Online (Sandbox Code Playgroud)

就是为Game,Level和Lane类编写一个doDamage方法.如果您的链式呼叫数量有限,这将有效.

Game类方法如下所示:

public void doDamage(int damage) {
    getCastle().doDamage(damage);
}
Run Code Online (Sandbox Code Playgroud)

以及Level和Lane类等等.