2013-04-24 130 views
1

我們在遊戲中實施了作爲學校作業的庫存。庫存是使用包含項目的ArrayList實現的。有不同類型的物品:手榴彈,RocketLaunchers等。訪客模式的實施

我們需要能夠將每個物品存儲在數組列表中。但是,一些物品有限制(例如庫存中只能有6枚手榴彈)。

我們不允許使用instanceof。所以我們實施了一個訪問者模式,將手榴彈添加到我們的庫存中,並且我們爲手榴彈使用了不同的列表,而不是其他項目。在評估任務時,我們被告知應該將每個項目存儲在同一個列表中。我們不允許在清單內保留手榴彈的數量。在我們嘗試在庫存中增加手榴彈之前,我們應該計算手榴彈的數量。但我們不知道如何實現這一點。

+0

標題提到訪問者模式。你嘗試過實施它嗎?有什麼問題? – 2013-04-24 13:53:01

+0

我們已經實現了將手榴彈添加到特定列表中,並將其他項目添加到通用列表中。問題在於數着手榴彈。 – 2013-04-24 17:07:37

回答

4

您猜對的訪客模式是正確的選擇。但是,實施,應該是這樣的:(僞代碼):

interface InventoryVisitor{ 
    onGrenade(theGrenade); 
    onDefaultItem(theItem); 
} 

class DefaultItem{ 
    visit(visitor){visitor.onDefaultItem(this);} 
} 

class Grenade extends DefaultItem{ 
    visit(visitor){visitor.onGrenade(this);} 
} 

那麼,你叫visit在inventoryList的每個項目與InventoryVisitor的實現,例如計算有多少手榴彈,並拋出一個例外,如果超過六個。

+0

感謝您的回答。 :) – 2013-04-24 14:26:03

-1

我假定你有一些接口Item和界面上你可以有一個方法getItemType它返回一個枚舉值。

public enum ItemType { 
    Grenade, 
    RocketLauncher 
} 

public interface Item { 
    ItemType getItemType(); 
} 

這不是很花哨,但你至少可以問它是什麼類型,而不使用instanceof的項目,你不必使用訪問者模式。但也許這種模式是這項任務的一部分?

+1

這實際上是一個不好的建議,因爲使用'enum'這種長期描述的方式最終會導致代碼中出現大量'switch',導致代碼難以維護和擴展。例如,當出現新類型時,最終會有很多地方需要更改。而在更大的項目中,這是不可行的。訪問者模式是解決這個問題的方法之一。 – 2013-04-24 14:04:47

+0

@AdamDyga我們正在談論**任務**!不要過度設計。 – maba 2013-04-24 14:08:28

+0

在我看來,即使是學生,也應該始終從最開始學習正確的方法 – 2013-04-24 14:10:30