我们在游戏中实现了一个清单,作为学校作业。库存是使用包含项目的ArrayList实现的。有不同类型的物品:手榴弹,RocketLaunchers等。
我们需要能够在数组列表中存储每一项。然而,有些物品有限制(例如,库存中只能有6个手榴弹)。
我们不允许使用instanceof。所以我们实现了一个访问者模式,它将手榴弹添加到我们的库存中,并且我们使用了一个与其他物品不同的手榴弹列表。在评估作业的过程中,我们被告知应该将每个项目都存储在同一个列表中。我们不允许清点库存中的手榴弹。我们应该先数一下手榴弹的数量,然后再尝试将手榴弹添加到库存中。但我们不知道如何实现这一点。
发布于 2013-04-24 21:54:54
正如您所猜测的那样,访问者模式是正确的选择。但如果实现了,它将如下所示:(伪代码):
interface InventoryVisitor{
onGrenade(theGrenade);
onDefaultItem(theItem);
}
class DefaultItem{
visit(visitor){visitor.onDefaultItem(this);}
}
class Grenade extends DefaultItem{
visit(visitor){visitor.onGrenade(this);}
}然后,在inventoryList的每一项上调用visit,并使用InventoryVisitor的实现来计算手榴弹的数量,如果超过6个,就抛出一个异常。
发布于 2013-04-24 21:56:44
我假设您有一些接口Item,并且在该接口上可以有一个返回枚举值的方法getItemType。
public enum ItemType {
Grenade,
RocketLauncher
}
public interface Item {
ItemType getItemType();
}它不是很花哨,但是你至少可以在不使用instanceof的情况下询问它是什么类型的,并且你不需要使用访问者模式。但也许这个模式是任务的一部分?
https://stackoverflow.com/questions/16193752
复制相似问题