基本的MVC模式通信

时间:2011-10-18 15:31:48

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

我刚开始研究模型视图控制器模式。我现在明白了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,这会破坏鼠标作为未来类输入的灵活性。

我也在哪个类中为角度计算编写代码?

提前致谢

2 个答案:

答案 0 :(得分:3)

请记住,MVC的目标主要是模型和视图的分离,而Controller可以作为两者之间的沟通者。

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

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

这当然是我的建议基于你的例子。事实上,根据项目,上述流程可能很容易改变(例如,在这种情况下,在命令中进行旋转计算似乎很好,但在其他情况下可能没有那么多意义)。将MVC看作一个目标 - 你试图尽可能地将这些元素分开,但没有100%“按时工作”的方式。

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

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

我不是在宣传你需要使用Robotlegs(这很好,但还有很多其他选择),但他们肯定做了一个漂亮的图表:)

答案 1 :(得分:0)

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

跟踪鼠标点击的视图应该调度一个控件组件捕获的事件来更新TurretModel(此时,可能不需要鼠标模型)。然后,您的TurretView可以根据TurretModel自行更新,或者Controller可以根据新值更新TurretView。这取决于你如何连线。

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