MVC的实现

时间:2012-10-22 10:15:34

标签: java design-patterns

我在理解和实现MVC模式时遇到了一些麻烦。

我有一个单独的“模型”类,它包含应用程序的所有数据并扩展了Observable。当修改这些数据时,我想更新视图,当其中一个视图收到用户的一些输入时,我想更新模型。在两者之间有一个Controller(实现Observer),它有一个视图和模型的实例。

我认为要做到这一点,视图必须有一个控制器的实例。每当它从按钮或任何组件接收到事件时,它就会调用正确的控制器方法,该方法将信息传输给模型。模型已更新并通知观察者,而观察者又将更新所有视图的所有组件,即使它们未链接到已修改的特定数据,因为Controller无法知道什么已在模型中修改过。我不确定这是一个好的设计。

我看了一下PropertyChangeListener类,它似乎纠正了这个问题,但我不太确定我理解了一切。有没有首选的方法呢?

提前致谢!

1 个答案:

答案 0 :(得分:2)

您提出的建议存在一些问题。

首先,您要描述的是MVVM,而不是MVC

第二个问题是术语modelcontroller并不是用来描述单例。它们仅仅是通过将您的逻辑组织成具有明确职责的类来帮助您分离问题的术语。

MVC结构如下:

模型

这是您的应用程序逻辑/业务规则。这基本上意味着如果您的应用程序是关于电话簿的,那么所有与提供电话簿API有关的逻辑和数据结构都在这里实现。

视图

该层与模型完全分离,因为它不关心数据结构或逻辑,只关注呈现简单值。字符串,整数,集合,你的名字。但它并不关心模型的API,它只取决于控制器的。

控制器

这是事情的结合。控制器是调解员。它讲的是模型的语言和视图的语言,它可以使它们协同工作。用户请求被路由到控制器。 例如,请求可能希望列出电话簿中的所有号码。会发生什么:

  1. 控制器收到请求
  2. 通过模型的API
  3. 向模型询问电话簿中存在的所有号码
  4. [可选]将数据转换为视图要显示的数据结构
  5. 将数据传递给视图
  6. 在我们结束之前的最后一句话:

    如果控制器没有将模型中的数据转换为简单的数据,那么据称视图现在与模型紧密耦合。但是,并非总是如此。即使模型的API发生变化,控制器仍然可以将新API调整为旧API,而视图已经理解了这一点。