【问题标题】:In MVC is the View allowed to see but not talk to the model?在 MVC 中,视图是否允许查看但不能与模型对话?
【发布时间】:2015-03-14 23:29:18
【问题描述】:

我一直在阅读有关 MVC 的内容,并一直在尽我所能地遵循它,但有一件事不断出现。

视图可以看到模型对象吗?

我目前的游戏结构如下。

对象(模型) 场景(控制器) 精灵(视图)

目前我做以下事情。

场景创建一个 MapObject(model)。然后场景创建一个 MapSpriteNode(view),但使用 MapObject 对其进行初始化。 MapSpriteNode 需要绘制并使用信息来布局其视图和子视图。现在 MapSpriteNode 可以保留对该 MapObject 的引用,但无论如何都不允许更改 MapObject。这样,当在 MapSpriteNode 上调用 update 时,它​​可以看到 MapObject 上的脏切片索引等内容,并且可以更新其对应的 TileNode。

所以现在发生了这种情况

Sprite 被触摸并通知控制器 --> 控制器向模型报告交互 --> 模型相应地更新并标记脏索引

发生更新循环

Scene 调用 update 到 -> MapObject(任何其他需要随时间发生的更新) 场景调用 update 到 -> MapSpriteNode(查看是否有脏索引和更新) 场景调用 cleanup dirty to -> MapObject(因为渲染完成,脏索引被移除)

这还是在遵循 MVC 吗?

【问题讨论】:

    标签: architecture design-patterns model-view-controller


    【解决方案1】:

    “视图可以看到模型对象吗?”

    是的,只要您不通过视图更改任何内容,视图就可以看到模型的“内部”。

    “这还是在遵循 MVC 吗?”

    肯定的。

    在MVC架构中,Model应该独立于Controller和View,如果是“被动”实现(你的情况),View应该在得到Controller通知后轮询Model来获取数据,而不是被通知由模型来这样做(你可以假设在这种“被动”的情况下模型甚至不知道控制器和视图的存在)。

    View 应该在收到 Controller 通知时从 Model 轮询数据,这发生在 Scene 调用 MapSpriteNode 的 update 时,并且 View 还应该通知 Controller 诸如 Sprite 在被触摸后通知 Controller 等事件。

    就 Controller 而言,它应该通知 View 更新,就像 Scene 调用 MapSpriteNode 的 update 一样,它应该通知 Model 更新。

    【讨论】:

    • 感谢您的回答。这是我第一次听说“被动”实现。您是否有一个很好的链接,您觉得可以很好地阐明“被动”和非被动之间的区别?如果有兴趣,我还有另一个关于 MVC 和特别是 SpriteKit 的问题gamedev.stackexchange.com/questions/96662/…
    • 关于 MVC 的维基百科文章对此进行了解释。当您将多个视图和控制器绑定到单个模型时,通常会使用 Active MVC。在这种情况下,在其中一个控制器更新模型后,所有视图也必须更新。为了做到这一点,模型必须通过观察者模式的使用通知他们。
    猜你喜欢
    • 2012-10-21
    • 2012-01-05
    • 2011-03-05
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多