MVC 中的设计模式

MVC 的模型/视图/控制器(Model / View / Controller)三元组被用来构建用户界面。

MVC 介绍

MVC包括三类对象:

不使用 MVC,用户界面设计往往将这些对象混在一起,而 MVC 则将它们分离以提高灵活性和复用性。

MVC 中的设计模式

MVC 的主要关系还是由 Observer、Composite和 Strategy 三个设计模式给出的。

MVC 还使用了其他的设计模式,如:用来指定视图缺省控制器的 FactoryMethod 和用来增加视图滚动的Decorator。

视图和模型的关系

MVC 通过建立一个 “订购/通知” 协议来分离视图和模型。

视图必须保证它的显示正确地反映了模型的状态。

一旦模型的数据发生变化,模型将通知有关的视图,每个视图相应地得到刷新自己的机会。

这种方法可以让你为一个模型提供不同的多个视图表现形式,也能够为一个模型创建新的视图而无须重写模型。

示例

模型包含一些数据值,视图通过电子表格、柱状图、饼图这些不同的方式来显示这些数据。

当模型的数据发生变化时,模型就通知它的视图,而视图将与模型通信以访问这些数据值。

1563363834415

Observer 模式

表面上看,这个例子反映了将视图和模型分离的设计,然而这个设计还可用于解决更一 般的问题:

将对象分离,使得一个对象的改变能够影响另一些对象,而这个对象并不需要知 道那些被影响的对象的细节。

这个更一般的设计被描述成 Observer 模式

嵌套视图

MVC 的另一个特征是视图可以嵌套。

示例

按钮控制面板可以用一个嵌套了按钮的复杂 视图来实现。

对象查看器的用户界面可由嵌套的视图构成,这些视图又可复用于调试器。

MVC 用 View 类的子类 — CompositeView 类来支持嵌套视图。

CompositeView类的对象行为上类似于 View 类对象,一个组合视图可用于任何视图可用的地方,但是它包含并管理嵌套视图。

Composite 模式

上例反映了可以将组合视图与其构件平等对待的设计,同样地,该设计也适用于更一般 的问题:

将一些对象划为一组,并将该组对象当作一个对象来使用。

这个设计被描述为 Composite 模式

Composite 模式允许你创建一个类层次结构,一些子类定义了原子对象(如 Button)而其他类定义了组合对象(CompositeView),这些组合对象是由原子对象组合而成的更复杂的对象。

视图和控制器

MVC 允许你在不改变视图外观的情况下改变视图对用户输入的响应方式。

示例

你可能希望改变视图对键盘的响应方式,或希望使用弹出菜单而不是原来的命令键方式。

MVC 将响应机制封装在 Controller 对象中。

存在着一个 Controller 的类层次结构,使得可以方便地对原有 Controller 做适当改变而创建新的 Controller。

View 使用 Controller 子类的实例来实现一个特定的响应策略。

要实现不同的响应策略只要用不同种类的 Controller 实例替换即可。

甚至可以在运行时刻通过改变 View 的 Controller 来改变 View 对用户输入的响应方式。

例如,一个View可以被禁止接收任何输入,只需给它一个忽略 输入事件的Controller。

Strategy 模式

View-Controller 关系是 Strategy 模式的一个例子。一个策略是一个表述算法的对象。

当你想静态或动态地替换一个算法,或你有很多不同的算法,或算法中包含你想封装的复杂 数据结构,这时策略模式是非常有用的。