【问题标题】:Need help with MVC-pattern需要 MVC 模式的帮助
【发布时间】:2011-04-26 08:15:19
【问题描述】:

我刚刚开始阅读有关 MVC 模式的内容,但我并不完全理解它。

模型管理行为和 应用领域的数据, 回应信息请求 关于它的状态(通常来自 查看),并响应指令 改变状态(通常从 控制器)。在事件驱动系统中, 模型通知观察者(通常 意见)当信息发生变化时 他们可以做出反应。

视图将模型渲染成表单 适合交互,通常是 用户界面元素。多个视图 可以为单个模型存在 不同的目的。视口 通常有一对一的 与显示表面的对应关系 并且知道如何渲染它。

控制器接收用户输入并 通过拨打电话发起响应 在模型对象上。控制器接受 来自用户的输入并指示 模型和视口来执行动作 基于该输入。

(来自http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

型号。模型管理行为 和应用领域的数据, 回应信息请求 关于它的状态(通常来自 查看),并响应指令 改变状态(通常从 控制器)。

查看。视图管理显示 信息。

控制器。控制器解释 从鼠标和键盘输入 用户,通知模型和/或 视情况进行更改。

(来自http://msdn.microsoft.com/en-us/library/ff649643.aspx

我想我了解模型和视图是什么,但是我不了解控制器。从我阅读的文本和一些示例中,我看到控制器从用户那里获取输入。我见过诸如(在 Java 中)之类的例子:控制器是一个 JOptionPane,它从用户那里接收一个华氏温度的数字。然后在模型中赋值和转换,并在命令行中显示结果。我不明白为什么控制器会这样接受输入?

在 Ruby on Rails 中,我拥有存储数据的模型、显示不同视图并对视图中接收到的输入进行“处理”的控制器。

【问题讨论】:

  • +1 @Niko:很好。您的最后一句话,关于您如何理解 RoR 中的控制器,也适用于其他语言。
  • @bguiz:谢谢。那是正确的吗?控制器显示一个适当的视图,用户与视图交互可能会在表单中填写一些数据,然后按提交,这些数据被控制器中的代码处理并插入到模型中?
  • 你最后一句话总结的很好。我也是这样理解的。你能指出你正在努力解决的例子吗?
  • das_weezul:我没有遇到特别困难的例子,我只是在正确理解这个概念时遇到了一些困难。

标签: java ruby-on-rails model-view-controller


【解决方案1】:

简单地说,

视图 - 负责从模型中绘制或渲染信息

模型 - 负责您的业务逻辑,并存储应用程序的状态

控制器 - 负责解释用户的操作并在模型上调用必要的事件并通知视图进行自我更新(如果需要)。

视图应该只负责绘制/渲染,所以它不应该知道用户交互时应该发生什么事件。模型应该只对业务逻辑和数据感兴趣。它不应该对视图一无所知。因此,控制器将这两部分联系在一起,允许模型可重用并在单个模型上启用多个视图(想想同一数据模型的移动/电视/网络视图)。

在 Web 世界中,控制器是接收 HTTP 输入的部分,视图是 HTML/JSP 代码,控制器是作用于 HTTP 请求以执行必要业务的 Servlet(或等效框架)该模型。

【讨论】:

  • 谢谢,让它更清楚一点,但我没有在上面的答案中看到用户输入适合的位置(不是网络世界)。
  • 用户输入由控制器处理。在桌面世界中,这将是您的 JComponent,例如 JTextPane,UI 由 JTextPaneUI 处理,模型是 StyledDocument。
【解决方案2】:

正如名称 controller 已经表明的那样,控制器解释输入并协调/控制模型和视图之间的通信,即它首先会触发模型更新,然后(如果视图没有) t 直接观察模型)通知模型变化的视图,以便它们可以自行更新。

【讨论】:

    【解决方案3】:

    控制器基本上接受用户交互,并使用某种映射,它会通过调用模型来发起响应。该模型将具有用于数据操作的业务逻辑。一旦控制器得到模型的响应,控制器就会将模型传递给视图,视图将呈现一个用于查看和用户交互的界面(基于模型)。

    在 Ruby on Rails 中,我有一个模型 存储数据,控制器 显示不同的视图并做 收到的输入上的“东西” 在视图中。

    模型很好,控制器必须负责用户交互和将模型渲染到 UI 的视图。

    【讨论】:

      【解决方案4】:

      想象一个非常基本的应用程序:一个反映数据库表的模型(Java bean)、一个带有标签和文本字段以显示所有值的对话框以及一个用于刷新内容的魔术按钮。

      控制器现在具有使用新值更新文本字段的逻辑用户点击(又名按下)按钮小部件。

      在这个简单的例子中:

       Model:      Java bean (fields, getters, setters)
       View:       frame with txtfields, labels and a button widget
       Controller: logic to tell the model to update itself, update the textfields and tell 
                   the view to refresh
      

      文本字段中的用户输入 - 如果您有数据绑定,那么数据绑定本身就是控制器的职责。因为数据绑定向模型和视图发送更新信号。如果您的应用程序不使用数据绑定,则模型更新由操作(按钮单击)或某些事件(焦点更改,...)触发。而这个逻辑又是控制器的一部分。

      顺便说一句:视图和控制器实现了经典的策略模式:vew 是一个配置有策略的对象(Head First Design Patterns,第 532 页)

      【讨论】:

      • 谢谢,我想我开始明白了。视图只是容器和盒子,当一些用户交互发生时,例如当用户点击按钮时,它是控制器的工作来获取盒子中的任何内容?
      • @Niko Aralo - 这就是我对 MVC 的理解(有时很难、很复杂并且通常没有必要将视图与控制器严格分开......)
      【解决方案5】:

      输入字段(例如 JTextField)是视图的一部分,用于确定对控制器中的哪些交互事件(键入字符、失去焦点、单击按钮...)执行什么操作的逻辑。

      就像在您的示例中一样,控制器的逻辑可以与视图在同一个类中。如果您扩展 JOptionPane 并实现 ActionListener 以便 JOptionPane 可以对 JTextField 的事件作出反应,就会出现这种情况。 但是如果你想建立一个清晰的 MVC 模式,这显然是不鼓励的,因为你会混合 View 和 Controller 的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多