访客模式的实现

时间:2013-04-24 13:49:30

标签: java

我们在游戏中实施了一个库存作为学校作业。使用包含项目的ArrayList实现清单。有不同类型的物品:手榴弹,RocketLaunchers等。

我们需要能够存储arraylist中的每个项目。但是,有些物品有限制(例如,库存中只能有6枚手榴弹。)

我们不允许使用instanceof。因此,我们实施了一个访客模式,将手榴弹添加到我们的库存中,我们使用了不同的手榴弹列表而不是其他项目。在评估任务期间,我们被告知应该将每个项目存储在同一个列表中。我们不允许计算库存中的手榴弹数量。在我们尝试将手榴弹添加到库存之前,我们应该计算手榴弹的数量。但我们不知道如何实现这一目标。

2 个答案:

答案 0 :(得分:4)

您猜到的访客模式是正确的选择。但实现后,它看起来像这样:(伪代码):

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

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

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

然后,您使用InventoryVisitor的实现在inventoryList的每个项目上调用visit,例如:计算有多少手榴弹并抛出异常,如果有超过六个。

答案 1 :(得分:-1)

我假设您有一些接口Item,并且在该接口上您可以使用方法getItemType来返回枚举值。

public enum ItemType {
    Grenade,
    RocketLauncher
}

public interface Item {
    ItemType getItemType();
}

它不是很花哨,但你至少可以在不使用instanceof的情况下询问该项目的类型,而且你不必使用访问者模式。但也许这种模式是作业的一部分?