避免使用以下实例:

时间:2015-05-29 17:50:20

标签: oop design-patterns

我正在写一个简单的游戏,我们有一个对象的集合,玩家在网格上移动,收集硬币并避免怪物。

我的班级结构如下所示。

游戏控制器 - 负责产生硬币并跟踪游戏状态

网格 - 存储当前在网格上的对象的类,以及一些与网格相关的方法。

GridObject - 表示网格上对象的抽象类。例如玩家,怪物或硬币。

Player,Monster,Coin - 全部扩展了GridObject。

编写碰撞处理的最OOP方法是什么?期望的结果是:玩家击中怪物 - 结束游戏,玩家击中硬币 - 增加分数,怪物击中硬币 - 没有。

目前,当GridObject移动时,它会通知棋盘对象它想要移动;如果这会导致碰撞,我会在GameController上调用一个处理程序(通过一个监听器模式)来处理碰撞。在那个以两个GridObjects作为参数的处理程序中,我使用了很多“instanceof”命令来区分上述情况。

避免使用所有这些“instanceof”的最佳方法是什么,我读过这通常意味着糟糕的设计?

2 个答案:

答案 0 :(得分:0)

您可以使用GridObject中的枚举来确定类型,而不是使用instanceof。这样,您只需比较枚举以检查哪些对象发生碰撞。例如,(警告,语法可能不完全正确)

public enum ObjectType {
    Player, Monster, Coin
}

private final ObjectType type;

public GridObject(ObjectType type) {
    this.type = type;
}

public ObjectType getType() {return type;}

然后在您的子类中,您必须执行以下操作:

public Player(your parameters) {
    super(ObjectType.Player);
}

然后检查类型,你可以这样做:

switch(gridObject.getType()) {
    case ObjectType.Player:
       // do something 
       break;
    case ObjectType.Monster:
        // do something else
        break;
    case ObjectType.Coin:
        // do something else
        break;
}

答案 1 :(得分:0)

介绍一些接口怎么样:

interface Interactable { 

   InteractionResult interact(WorldEntity entity);

}

interface WorldEntity {

    boolean isMonster();

    boolean isPlayer();

    boolean isPowerUp();

}

现在我们可以说,当玩家与我们可以做的其他事情互动时:

   public InteractionResult interact(WorldEntity entity) {
       if(entity.isMonster()) {
           return new DeathInteraction(this);
       }
       ...
   }

你没有消除所有条件,但至少你开始组织你的抽象并将你的课程分离。