1

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

我们需要能够将每个项目存储在一个数组列表中。但是,有些物品有限制(例如,库存中只能有 6 个手榴弹。)

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

4

2 回答 2

4

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

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

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

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

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

于 2013-04-24T13:54:53.740 回答
-1

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

public enum ItemType {
    Grenade,
    RocketLauncher
}

public interface Item {
    ItemType getItemType();
}

它不是很花哨,但您至少可以不使用就询问项目它是什么类型,instanceof并且您不必使用访问者模式。但也许模式是任务的一部分?

于 2013-04-24T13:56:43.660 回答