跳到内容

模型-视图-控制器

25% developed
来自维基教科书,开放的书籍,开放的世界

备忘录 计算机科学设计模式
模型-视图-控制器
观察者

模型-视图-控制器 (MVC) 模式是一种主要用于创建 图形用户界面 (GUI) 的架构模式。该模式的主要前提是基于模块化,其目的是将 GUI 的三个不同方面分开:数据 (模型)、数据的可视化表示 (视图) 以及视图和模型之间的接口 (控制器)。将这三个组件分开背后的主要思想是使每个组件尽可能独立于其他组件,对一个组件的更改不会影响对其他组件的更改。这样,例如,可以更新 GUI 的新外观或可视化样式,而无需更改数据模型或控制器。

新手可能会认为 MVC 模式浪费,主要是因为您在运行时使用许多额外的对象,而一个大型对象似乎就足够了。但 MVC 模式的秘密不在于编写代码,而在于维护代码,并允许人们修改代码而不改变太多其他内容。不同的开发人员有不同的优势和劣势,因此围绕 MVC 进行团队建设更容易。想象一个视图团队负责提供出色的视图,一个模型团队对数据了如指掌,以及一个控制器团队能够了解应用程序流程的大局,处理请求,与模型一起工作,并为该客户端选择最合适的下一个视图。

模型-视图-控制器模式的一大优势是能够在实现不同的视图时重用应用程序的逻辑(在模型中实现)。一个很好的例子是在 Web 开发中,一个常见的任务是在现有软件中实现外部 API。如果严格遵循 MVC 模式,这只需要修改控制器,控制器可以根据用户代理请求的内容类型呈现不同类型的视图。

模型

通常,模型首先构建。模型有两个任务:它必须存储状态管理订阅者。状态不需要是特殊的;您只需要定义如何使用设置器和获取器存储数据。但是,任何可以更改的内容(任何属性)都必须有一个监听器列表,当值更改时,它会联系这些监听器。属性监听器允许我们对相同数据有多个视图,当状态更改时,所有这些视图都会实时更新。此代码通常可以在超类中定义并继承,因此您只需在一个地方编写它,然后它就可以一致地应用于每个属性。嵌套状态(例如,动态配置的属性)可能需要您对如何报告更改进行一些额外的思考。

人们有时使用“模型”一词来指代“数据模型”——应用程序中数据结构的架构。一个好的 MVC 框架会为您处理模型超类和订阅,因此您只需在该框架的模型语言中定义自己的数据结构,然后立即构建其他组件。从最终用户意义上讲,定义数据模型等同于定义模型。但是,如果您正在设计一个框架,那么如果没有属性监听器,它就不是 MVC。

视图

编写数据模型后,接下来最容易编写的是视图。视图是订阅模型的应用程序的一部分。通常,它会将模型呈现给用户以及用户界面或 GUI。GUI 也包含其他组件,这些组件通常是控制器的一部分,可以在以后处理。

您还可以使用与用户界面无关的视图-控制器组件。例如,您可以想象一个 MVC 电路板应用程序,其中模型仅管理整个电路中的数字(电压和电流)。例如,电阻器会对两端电压有一个“视图”,并与“控制器”紧密耦合,该控制器会更新流过该电阻器的电流。通过模型互相通信的所有组件最终将实时执行电路的动作。

编写视图时,要考虑两个方面:“当状态更改时我该怎么办?”和“我如何将此内容显示给用户?”您的 MVC 框架通常为模型中的各种属性提供编辑器,例如日期选择器、文本字段、滑动条和 组合框。更复杂的属性通常需要更复杂的视图和编辑器,例如树视图。您的 MVC 框架可能已经弄清楚如何将这些组件连接到模型,甚至可能根据模型中给定属性的类型自动生成合适的组件。

控制器

GUI 的其余部分——当模型更改时不会更新的部分——是控制器的责任。这包括在视图中导航,以及当有人尝试编辑视图中的数据时您要做什么。严格来说,视图不能编辑,它是“只读”的——当您尝试修改视图中的字段时,控制器需要获取编辑事件,处理它,并将其发送到模型;当值实际更改时,模型会更新视图。

不同的框架以不同的方式处理控制器。一些框架允许将回调函数与编辑器相关联,这些回调函数在值更改时被调用。其他框架允许您直接向组件添加监听器,这些监听器可以在编辑器中的值更改、单击编辑器或编辑器失去焦点等情况下收到通知。在许多框架中,控制器表现为一系列方法和监听器,这些方法和监听器内置在数据模型和视图中。例如,如果您在模型中有一个“密码”属性,该属性需要在存储之前进行 加盐哈希处理,此逻辑可能会出现在数据模型中名为 setPassword 的函数中。同样,当框架生成视图时,视图的窗口小部件通常不是只读的,而是读写的,具有监听器。MVC 框架提供的实际控制器然后“插入”到每个这些接口中,并在它们之间传递数据。

验证

如果可能,通常最好允许模型执行所有必要的验证,以便对允许值的任何更改,或者对验证过程本身的任何更改,只需在一个地方进行。但是,在某些语言的某些情况下,这可能无法实现。例如,如果使用文本字段编辑数字属性,那么视图传递给控制器的属性值将是文本,而不是数字。在这种情况下,可以使模型具有一个附加方法,该方法将文本作为该属性的输入值,但更有可能的是,控制器将执行文本的初始解析以获取数值,然后将其传递给模型以进行进一步的验证(例如,边界检查)。当控制器或模型确定传递的值无效时,控制器需要告诉视图该值无效。在某些情况下,视图可能会显示错误对话框或其他通知,或者它可能会简单地将其编辑器中的值还原到旧的有效值。

Java 中的实现

在 Java 中,我们可以实现一个胖客户端 GUI。在这种情况下,我们可以使用

但是,在 Java EE 中,我们还可以实现一个 Web 应用程序。在这种情况下,我们可以使用


Clipboard

待办事项
添加更多示例。


备忘录 计算机科学设计模式
模型-视图-控制器
观察者


您对本页有疑问吗?
在这里提问


在本图书中创建一个新页面


华夏公益教科书