2012-08-17 140 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

要麼你有邏輯倒退 - 消耗品應該傳遞給消費者,消費品應該有消費者可以打電話的方法,或者所有消費者應該實施消耗品可以打電話給他們的所有可能的方法,並且正確的事情,這可能不算什麼。