【问题标题】:Basic MVC pattern communication基本 MVC 模式通信
【发布时间】:2011-12-10 05:21:50
【问题描述】:

我刚开始研究模型视图控制器模式。我现在了解了 MVC 的基本用法,但是当我尝试在一个简单的测试中实现 MVC 时,我遇到了问题。 Ofcoarse 我可以轻松地调整代码以使其正常工作,但我想学习如何正确实现 MVC 模式。

测试: 我使用actionscript 3 制作了一个简单的程序。它由一个炮塔和一个鼠标点击组成。炮塔位于屏幕中间。当我单击任意位置时,炮塔会朝我单击的点旋转。鼠标和炮塔都有自己的模型、视图和控制器。当我单击时,MouseModel 会正确更改。但是为了让实际的 TurretView 做出响应,TurretModel 必须更改其旋转变量并发送事件。

问题是谁响应 MouseModel 事件?

     /------->MouseControl------\
    /                            \
MouseView                ?<---MouseModel

TurretView <------------------TurretModel

             TurretControl

我认为最好不要让 MouseModel 直接影响 TurretModel 或 TurretControl,因为这将要求它们成为 eventListener。让 TurretView 监听 MouseModel,然后告诉 TurretControl 调整 TurretModel,之后 TurretView 可以通过 TurretModel 事件进行更新,这看起来像是一个简单任务的大量额外代码。我也不想让 MouseControl 影响 TurretModel,这会破坏鼠标作为未来类输入的灵活性。

哦,我还要把角度计算的代码放在哪个类中?

提前致谢

【问题讨论】:

    标签: actionscript-3 model-view-controller oop design-patterns


    【解决方案1】:

    请记住,MVC 的目标主要是分离 Model 和 View,而 Controller 可以充当两者之间的沟通者。

    除非您计划存储发生的每个动作(单击、旋转等),否则(在这种情况下)没有真正需要将数据发送到模型的动作。您想做的所有事情都应该使用 Controller 轻松处理。所以流程是:

    • 鼠标点击
    • 触发事件以触发命令(在控制器中),沿鼠标位置传递
    • 该命令计算炮塔的旋转
    • 该命令告诉视图旋转炮塔

    当然,这是我根据您的示例提出的建议。事实上,根据项目,上述流程很容易改变(例如,在这种情况下,在命令中进行旋转计算似乎很好,但在其他情况下可能没有多大意义)。将 MVC 视为一个目标 - 您正在尝试尽可能多地分离这些元素,但没有 100% 的“每次都有效”的方式来做到这一点。

    Robotlegs,一个流行的 MVC 框架,在他们的网站上有一张很棒的图表,展示了他们如何处理 MVC:

    http://www.robotlegs.org/diagram/

    我不是在宣传你需要使用 Robotlegs(这很好,但还有很多其他替代品),但他们确实做了一个漂亮的图表 :)

    【讨论】:

      【解决方案2】:

      您应该有 一个 模型,其中包含您当前调用 MouseModel 和 TurretModel 的部分。您可以保留这些名称和细分,或者在您更好地“掌握”需要做的事情后做其他事情。

      跟踪鼠标点击的视图应该调度一个事件,控制器组件捕获该事件以更新 TurretModel(此时,可能不需要 MouseModel)。然后,您的 TurretView 可以根据 TurretModel 更新自身,或者 Controller 可以根据新值更新 TurretView。这将取决于您的接线方式。

      使用像 Robotlegs 这样的框架可以帮助你弄清楚这个过程的所有细节,我听说这本书 http://shop.oreilly.com/product/0636920021216.do 提供了对 MVC 的很好的解释,即使你不选择使用阅读后的Robotlegs。

      【讨论】:

        猜你喜欢
        • 2013-02-08
        • 2012-11-01
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 1970-01-01
        相关资源
        最近更新 更多