假设有一个 GameState 类型,它使用 GameContext(通过 process 方法):

abstract class GameState {
    public abstract void process(GameContext context);
}

GameContext 将包含诸如玩家、商店等内容,这些内容对游戏至关重要。

一个状态将访问它所需要的:
class CombatState extends GameState {
    public void process(GameContext context) {
        Player player = context.getPlayer();

        if(player.isAlive()) {
            //...
        }
    }
}
player.isAlive() 语句可以重写为 context.getPlayer().isAlive()

我的问题

得墨忒耳定律指出,物体只能与直系亲属互动。这是否违反原则,如何解决?

对于要动态处理的每个状态,所有可能的状态都必须接受形式参数。这使得很难严格传递对象所需的内容,这就是为什么每个状态都从“主要来源”中获取所需内容的原因。我觉得主要来源的内聚力非常低,因为 ShopState 需要与 CombatState 不同的数据

最佳答案

状态不是过程,过程是过程。奋斗是一个过程,活着是一种境界。

使用 process 的抽象名称使您需要打破 Demeter 定律。

看这个例子:

class CombatProcess extends GameProcess {
    public void hit(Player puncher, Player beaten) {
        if (beaten.getState().isAlive()) {
           Weapon oneWeapon = one.getCurrentWeapon();
               ...
        }
    }
}

CombatProcess 中的所有内容都尽可能具体。

分析哪个玩家与哪个玩家战斗不是 CombatProcess 本身的责任!在 CombatProcess 开始之前,您必须知道您的对手是谁。

编辑:

在此答案的评论中,您写道:



这是完全正确的。 Hook/Anchor-Pattern 是从 1996 年开始的,并且仍然在 windows 中广泛使用和荣耀(所谓的 system-hooks )。不幸的是,由于一些批评,它确实 而不是 找到了进入 OOD 前 10 种模式的方法。其中一位评论家是:



我的个人观点是,Hook/Ancher-Pattern 在 1996 年是革命性的,并且在 future 与 CDI(例如 spring)结合时将是革命性的。

最后!你可以决定:
  • 打破得墨忒耳定律。
  • 删除钩子(Hook)/ anchor 定模式。
  • 编写描述 here 的解决方法。
  • 关于java - setter/getter 是否违反了得墨忒耳定律?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34173344/

    10-10 06:19