4

我想知道控制器从哪里获取用户输入(以提供模型)。因为输入媒体与用户密切相关,视图不应该知道获取用户数据的具体方式吗?但是我怎样才能将控制器与视图分开呢?是否有可能使两者完全独立,如它们的目的所暗示的那样?

示例: 当我有一个使用 curses 库作为视图的应用程序时,这意味着它只能通过终端访问。在控制器中使用 curses 方法读取用户数据会破坏封装,但在视图上调用方法与显示模型无关。

4

5 回答 5

3

在 MVC 中,控制器从视图中获取其用户输入。

于 2009-07-29T14:36:38.373 回答
1

我认为视图实际上与输入数据没有太大关系。如果您看到用户直接与控制器通信,我发现 MVC 更容易可视化。控制器从用户接收数据并将视图发回。在许多系统中,视图引擎有一些有限的自我更新方式(即文本输入显示在发送到控制器之前输入的内容)。但是对于任何 MVC 类型的架构,只要它们都能够处理相同的数据,您就可以将任何视图替换为任何其他视图。

例如。可以在任何支持输入字符串的系统上输入用户名。控制器接受字符串,因此可用于 Web 应用程序、终端应用程序或 GUI 应用程序。

于 2009-07-29T14:46:59.590 回答
1

考虑让视图和控制器通过观察者模式进行通信。Controller 将自己注册为 View 的 Observer。当用户将数据输入到 View 并按下 Enter 时,View 会解释数据并通知其观察者有可用的数据。然后,Controller 可以通过公共方法从 View 获取数据。

于 2009-07-29T14:37:47.267 回答
0

出色地,

我会尽量为你更具体。为您可以看到的 ppl 提供模糊/抽象的答案,不掌握主题,没有帮助。

MVC -> 模型视图控制器

MVC的实现有很多,我不知道你的情况,但我给你一个。

最常见的 MVC 实现是这样的。

视图 <-> 控制器 <-> 模型

在网络场景中..

视图将是您的 HTML 页面,数据输入将发生在表单中。

<form action=/home/createuser method=post>
...code goes here...
</form>

Home 将是您的控制器(一个名为 home 的类),并且 createuser 是 home 中的一个方法。

public class Home extends Controller {

   public void createUser(Userform f){
      ...create user...
   }
}

此表单会将数据作为参数提交到方法中。Createuser 会处理它们以与模型对话,然后在这种情况下保留数据。

于 2009-07-29T14:52:41.967 回答
0

我认为视图应该在控制器上有一个回调来发送用户输入。在 Web 架构中,回调是通过 http 请求将用户输入发送回服务器的能力提供的。

在您的情况下,您的 ncurse 前端可能应该对控制器组件具有某种回调方法以发回用户输入。

于 2009-07-29T14:38:52.770 回答