首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问者模式的实现

访问者模式的实现
EN

Stack Overflow用户
提问于 2013-04-24 21:49:30
回答 2查看 118关注 0票数 1

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

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

我们不允许使用instanceof。所以我们实现了一个访问者模式,它将手榴弹添加到我们的库存中,并且我们使用了一个与其他物品不同的手榴弹列表。在评估作业的过程中,我们被告知应该将每个项目都存储在同一个列表中。我们不允许清点库存中的手榴弹。我们应该先数一下手榴弹的数量,然后再尝试将手榴弹添加到库存中。但我们不知道如何实现这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-24 21:54:54

正如您所猜测的那样,访问者模式是正确的选择。但如果实现了,它将如下所示:(伪代码):

代码语言:javascript
复制
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个,就抛出一个异常。

票数 4
EN

Stack Overflow用户

发布于 2013-04-24 21:56:44

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

代码语言:javascript
复制
public enum ItemType {
    Grenade,
    RocketLauncher
}

public interface Item {
    ItemType getItemType();
}

它不是很花哨,但是你至少可以在不使用instanceof的情况下询问它是什么类型的,并且你不需要使用访问者模式。但也许这个模式是任务的一部分?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16193752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档