我们在游戏中实施了一个库存作为学校作业。使用包含项目的ArrayList实现清单。有不同类型的物品:手榴弹,RocketLaunchers等。
我们需要能够存储arraylist中的每个项目。但是,有些物品有限制(例如,库存中只能有6枚手榴弹。)
我们不允许使用instanceof。因此,我们实施了一个访客模式,将手榴弹添加到我们的库存中,我们使用了不同的手榴弹列表而不是其他项目。在评估任务期间,我们被告知应该将每个项目存储在同一个列表中。我们不允许计算库存中的手榴弹数量。在我们尝试将手榴弹添加到库存之前,我们应该计算手榴弹的数量。但我们不知道如何实现这一目标。
答案 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
的情况下询问该项目的类型,而且你不必使用访问者模式。但也许这种模式是作业的一部分?