MVC(Model-View-Controller)是开发有用户界面的软件最常见的架构之一。它将一个给定的软件应用程序分成三个相互连接的部分,从而将信息的内部表示与它被展示给用户或者接受用户输入的部分分开。
MVC的概念最初在70年代提出,随后不断地演化,产生了许多变种,例如HMVC(Hierarchical Model-View-Controller), MVA(Model-View-Adapter), MVP(Model-View-Presenter),MVVM(Model-View-Viewmodel)等。
在MVC模式中,软件可以分为三部分:
- 视图(View):即用户界面,显示数据和接受用户交互
- 控制器(Controller): 实现业务逻辑
- 模型(Model):数据的存储,数据库的操作等。
它们之间的联系为:
- View接受用户交互请求,将指令传送给Controller
- Controller实现业务逻辑,并且通过Model改变数据的状态
Model将新的数据的状态传递给View, 显示给用户。
View和Controller之间使用策略模式,View使用组合模式,View和Model之间使用观察者模式。在MVC模式中,一个Controller可以被多个View使用,Controller不必知道View的细节。MVC的缺点之一是对Controller进行单元测试比较困难。这里所有的通信都是单向的。
MVP模式将Controller该名为Presenter, 通信方向也由单向变为双向,View与Model彻底分开,二者之间通过Presenter连接。View非常薄,少负责或不负责业务逻辑,而Presenter非常厚,大部分或所有的业务逻辑都在其中。
- View接受用户交互请求,转交给Presenter
- Presenter操作Model更新数据 数据更
- Model通知Presenter
- Presenter更新View-
与MVC的不同之处在于Presenter可以反作用于View。实际中MVP可以有两种实现,一种是Passive View,在View中放置简单的逻辑,而Presenter复杂复杂的逻辑。另一种是Supervising Controller, 倾向于在Presenter中放置全部的逻辑。可以集中测试Controller, 减少View出问题的风险。
MVVM模式将Presenter该名为ViewModel, 几乎与MVP模式完全一致。
这个Viewmodel除了一般的属性以外,还包括一些与View的显示有关的属性。通过双向绑定,使View的变动自动反映在Viewmodel中,反之亦然。在支持双向绑定的平台,MVVM更受欢迎。例如微软的WPF和Silverlight。