2013-04-24 95 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