2012-08-17 102 views
1
class Entity { 
    // various fields and methods 
} 

class MobileEntity extends Entity { 
    // various fields and methods 
} 

interface Consumer { 
    public void consume(final Consumable c); 
} 

interface Consumable { 
    public void onConsume(final Consumer c); 
} 

class Player extends MobileEntity implements Consumer { 
    // Override methods, etc 
    // Can consume 
} 

class Npc extends MobileEntity { 
    // Cannot consume anything 
} 

class Food implements Consumable { 
    public void onConsume(final Consumer c) { 
     if (c instanceof Player) { 
      healPlayer(); 
      removeFood(1); 
     } 
    } 
} 

不好意思把所有的代码都放在第一位,但我觉得这对我来说更容易解释,并且让你明白你是否看到它。这是我正在开发的一款游戏。我遇到的问题是如何在不使用运算符的情况下处理消耗品(不管它是食品还是饮料)。我想避免在食品类中设置具体类玩家(因为最终可能会有数百种不同类型的食品),但是在每种情况下都存在例外情况(这表明存在问题)。避免使用OOP

不是所有的实体实现都会有一个健康字段。他们可能,但即便如此,我也需要标注特定的一些如“易受攻击”,然后有一个测试

void applyDamage(int damage) { 
    if (attackable) { 
     health -= damage; 
    } 
} 

它引入了新的问题,由于硬编码的行为(的指标引入新的类)

我听说可能在类似的线程中使用Visitor模式,但我不认为它适用于当前情况。

+0

我将消费者传递给消费品的原因是,不同的消费品对象可能需要访问消费者的不同方面。例如,食物会增加/减少健康,药水可能对玩家造成独特的影响,喝啤酒可能会使他们头晕目眩等等。所有需要由消费品(食品,药水,啤酒等)定义的东西) – Zymus 2012-08-17 02:51:39

回答

3

由于Player实现Consumer,因此Food中的onConsume方法应该只调用Consumer上的consume()方法。在这种情况下,玩家的消费版本可以做正确的工作。 instanceof不仅坏,而且在装饰对象时会失败。

+0

我将消费者传递给消费品的原因是因为不同的消费品对象可能需要访问消费者的不同方面。例如,食物会增加/减少健康,药水可能对玩家造成独特的影响,喝啤酒可能会使他们头晕目眩等等。所有需要由消费品(食品,药水,啤酒等)定义的东西) – Zymus 2012-08-17 02:30:37

2

您的消费者有消费()方法,玩家是消费者,为什么不将消费品传递给消费者?另一方面,玩家,Npc和Food似乎都是数据模型,因此您可能希望在所有模型中保留任何业务逻辑(例如增加健康或移除食物)。在这种情况下,你需要一组单独的类来知道当玩家食用食物时该怎么做。

0

要么你有逻辑倒退 - 消耗品应该传递给消费者,消费品应该有消费者可以打电话的方法,或者所有消费者应该实施消耗品可以打电话给他们的所有可能的方法,并且正确的事情,这可能不算什么。