模型视图控制器 – MVC系统如何工作?

我正在尝试学习MVC模式,但每个地方都说不一样。所以现在我不知道真正的MVC是什么。

所以我猜测它最纯粹的MVC:

>模型只是数据并通知数据更改。
>视图读取模型的消息以更新视图。
>控制器从视图读取用户输入,并根据变更模型。

实施

>模型不知道。
> View了解模型。
>控制器知道View和Model。

伪代码:

/* Model */
class Color{ 
  color = blue;
  setColor(color);
  notifyUpdate();
}
/* View */
class ColorPicker(model){
  model.register(update);
  update(){
    this.colorToExhibit = model.color;
  }
}
/* Controller */
class Colorize(view, model){
  view.register(update);
  update(color){
    model.setColor(color);
  }
}

一些问题:

>是对的吗
>我不明白为什么View不能直接改变Model,而是通过Controller。
>假设我有一个动作后执行动画。谁必须处理这个动画:模型,视图或控制器?另外:动画逻辑是Model,View或Controller的一部分?更多:假设一个扑克游戏。用户选择一个动作(比如说“提升”)后,系统必须播放动画(比如从播放器点到芯片)。我如何看到这个扑克示例(使用动画)作为MVC?你可以解释并给出一个伪代码吗?

谢谢。

  • Model is just data and notify data changes.
  • View reads the messages of the Model to update the view.
  • Controller reads the user input from View and changes the Model according.

该模型不仅仅是数据。该模式也是业务逻辑。它包含系统的所有智能,或至少抽象幕后智能(如数据库调用或其他服务调用)。考虑一下这个说法,“保持你的模型重,你的控制器变亮”。

  • Model knows no one.
  • View knows the Model.
  • Controller knows both View and Model.

模型知道没有人,它是正确的。该模型应该在应用程序之间移植,并且不应该以任何方式依赖于UI的关注。 (在这种情况下,视图和控制器是UI关注的。)

视图知道模型,也是正确的。视图基本上“绑定”到模型。它呈现所有UI元素,并将UI数据相应地放置在UI元素内。

控制器“知道视图”。它知道哪个视图应该直接控制,但它不知道该视图的任何内容。它也不知道哪个控件以前来自哪个视图。控制器响应事件。一个事件来自UI,带有某种状态信息(一个ViewModel,也许),通过模型(业务逻辑发生的地方)来指导逻辑控制,并用一个Model(或一个ViewModel,如果形状特定视图的数据与模型不同)和视图。

I can’t see why the View cannot change the Model directly, but through Controller.

视图可以在用户交互的上下文中操作模型,但不应该期望这些更改以任何方式持久存在。视图应该被视为“客户端”,并不知道任何“服务器端”。 (即使您在谈论本机应用程序而不是Web应用程序。)持久化任何更改都被视为UI“操作”或“事件”,并将转到控制器来实现。

Suppose I have animations to be performed after an action. Who must handle this animation: the Model, the View, or the Controller? Also: the animation logic is part of the Model, View, or Controller?

一个动画听起来像一个完全基于UI的操作。它将在视图内。是否有更多的事情,而不仅仅是一个UI动画?动画是否会在后端改变任何东西?例如,如果我有一个Web应用程序,并且当一个页面加载时,我想淡入一些完全在视图中的数据(动画)…。数据将像任何其他数据一样传递给视图,动画完全在UI(视图)中完成。它不会从模型或控制器的角度做任何事情。

Suppose a Poker game. After the user choose an action (say, ‘Raise’), the system must play an animation (say, the chips going from player spot to the desk). How can I see this poker example (with animation) as a MVC? Can you explain and give a pseudocode about that?

action(“Raise”)是Controller事件。 UI将联系控制器执行“加注”。所以Controller可能有这样的方法:

View Raise(GameState state)
{
    // Interact with the Models to update the known state of the game.
    // The Models would perform the actual Poker game logic.
    // Respond with a View bound to updated Models.
}

一旦Controller通过新的View响应UI,该视图将包含要向用户显示的任何动画。 (毕竟,除非操作成功,否则你不想执行动画,对吗?当Controller通过一个新的View来响应UI,表示一个成功的动作时,动画就会播放,可能会响应UI一个视图指示一个错误,在这种情况下,该视图将显示其他内容。)

翻译自:https://stackoverflow.com/questions/10774263/how-does-an-mvc-system-work

转载注明原文:模型视图控制器 – MVC系统如何工作?