创建者:
Trygve Reenskaug
定义:
模型-视图-控制器(Model-View-Controller, MVC)体系结构模式将一个交互式应用程序分为三个组件。模型包含核心功能和数据。视图向用户显示信息。控制器处理用户输入。视图和控制器共同构成了用户接口。变更-传播机制确保了用户接口和模型之间的一致性。
语境:
具有灵活人-机接口的交互式应用程序。
强制条件:
1 相同信息可以在不同的窗口中有不同的表示。例如,直方图和饼图。
2 应用程序的显示和行为必须立即反映出对数据的操作。
3 用户接口应易于改变,甚至在运行期间也应该可以修改。
4 支持不同的“式样和感觉”标准或移植用户接口不应影响用户程序内核代码。
结构图:
所有的业务逻辑和数据处理都被封装在Model这一块。在具体的实现中就是一些类文件。而视图主要向用户展示数据,比如直方图,饼图等等。控制器用户捕捉用户的输入,如点击按钮,输入数据等。然后调用Model中相对应的方法进行数据的处理。
每一个视图一般都会有一个控制器与之对应。在Model中的数据出现了更改以后,Model会通知在它那里注册的所有的视图和控制器进行同步的更新。视图主要是从Modle中得到新的数据并展现出来。而控制器主要是对一些输入控制的组件的状态进行改变,比如一个按钮从可用状态变成不可用状态等。
通过上面的叙述,每个Model应该拥有一个Notify函数,而在此Model中注册的视图和控制器都应该被存储在一个列表中。在更新的时候只要对这个列表进行遍历,然后一次调用视图或控制器中的Update()方法就可以触发各个视图和控制器的状态变化。比如,视图可能会调用getData()方法到Model中取得数据,而控制器的getState()方法到Model中取得状态信息。如果视图和控制器是一一对应的关系那么也可以通过视图来更新控制器的改变。这个时候控制器就必须注册到视图中。
优点:
1 同一模型的多个视图。由于视图和模型已经分离。
2 同步化视图。通过观察者将视图和控制器与Model上的数据进行同步。
3 “可插入”的视图和控制器。可以方便为视图替换控制器。从而影响视图的输入功能。
4 “式样和感觉”的可交换性。由于模型独立于所有用户接口代码,因此MVC应用程序到新平台并不影响应用程序的功能内核(Model)。只要修改视图和控制器组件就可以了。
缺点:
1 增加了程序的复杂性。
2 潜在过多的更新因素。单一用户动作可能导致过多或者不必要的更新。例如一个视图窗口可能已经最小化了,那么就没有必要更新视图。
3 视图和控制器之间的紧密联系。虽然控制器和视图是不同的组件,但是如果真正单独使用一个的机会很少。一般是一对一对的使用。
4 视图中数据访问的低效率。需要多次调用才可以取到需要的数据。
5 移植时对视图和控制器更改时不可避免的。由于这两个组件依赖具体的系统平台。
参考:
1 面向模式的软件体系结构 卷1:模式系统
2 互联网资源