如何理解MVC、MVP、MVVM?他们的区别是什么?
如何理解MVC、MVP、MVVM?他们的区别是什么?
熊就该有个熊样_R好的,我们来理解一下 MVC、MVP 和 MVVM 这三种常见的软件架构模式,并分析它们的区别。 它们都是为了解决 UI 代码的组织、测试和维护问题而提出的。
1. MVC (Model-View-Controller):
组成部分:
- Model (模型): 负责处理应用程序的数据和业务逻辑。 例如,从数据库中读取数据、进行数据计算、更新数据等。
- View (视图): 负责显示用户界面,并将用户的操作传递给 Controller。 View 通常是被动的,只负责显示数据,不负责处理业务逻辑。
- Controller (控制器): 负责接收用户的输入,并根据用户的输入来更新 Model 和 View。 Controller 充当 Model 和 View 之间的桥梁。
交互方式:
- 用户与 View 交互。
- View 将用户的操作传递给 Controller。
- Controller 根据用户的操作更新 Model。
- Model 数据发生改变后,通知 View 更新显示。 (在经典 MVC 中,View 可以直接访问 Model)
- View 根据 Model 的数据进行更新。
优点:
- 职责分离: Model、View 和 Controller 各司其职,代码结构清晰。
- 可测试性: 由于职责分离,可以更容易地对 Model 和 Controller 进行单元测试。
- 可维护性: 代码结构清晰,易于维护和修改。
缺点:
- View 和 Model 紧耦合: 在经典 MVC 中,View 可以直接访问 Model,导致 View 和 Model 紧耦合,不利于单元测试和代码重用。
- Controller 职责过重: Controller 负责接收用户的输入、更新 Model 和 View,职责过重,容易变得臃肿。
适用场景:
- 简单的应用程序,UI 逻辑不复杂。
理解要点:
- Controller 是核心,负责协调 Model 和 View。
- View 通常是被动的,只负责显示数据。
- View 可以直接访问 Model (经典 MVC)。
2. MVP (Model-View-Presenter):
组成部分:
- Model (模型): 与 MVC 中的 Model 相同,负责处理应用程序的数据和业务逻辑。
- View (视图): 与 MVC 中的 View 类似,负责显示用户界面,并将用户的操作传递给 Presenter。 View 是被动的,只负责显示数据,不负责处理业务逻辑。
- Presenter (展示器): 负责从 Model 中获取数据,并将数据传递给 View 进行显示。 Presenter 还负责接收用户的输入,并根据用户的输入来更新 Model。
交互方式:
- 用户与 View 交互。
- View 将用户的操作传递给 Presenter。
- Presenter 根据用户的操作更新 Model。
- Model 数据发生改变后,通知 Presenter。
- Presenter 从 Model 中获取数据,并将数据传递给 View 进行显示。 (View 不直接访问 Model,而是通过 Presenter 来获取数据)
- View 根据 Presenter 传递的数据进行更新。
优点:
- 职责分离: Model、View 和 Presenter 各司其职,代码结构清晰。
- 可测试性: 由于职责分离,可以更容易地对 Model 和 Presenter 进行单元测试。 View 通常是通过接口来定义的,可以很容易地使用 Mock 对象进行测试。
- 可维护性: 代码结构清晰,易于维护和修改。
- View 和 Model 解耦: View 不直接访问 Model,而是通过 Presenter 来获取数据,降低了 View 和 Model 之间的耦合度。
缺点:
- Presenter 数量增加: 每个 View 都需要一个对应的 Presenter,导致 Presenter 的数量增加。
- 代码量增加: 相对于 MVC,MVP 需要编写更多的接口和类。
适用场景:
- UI 逻辑复杂的应用程序。
- 需要进行单元测试的应用程序。
理解要点:
- Presenter 是核心,负责协调 Model 和 View。
- View 是被动的,只负责显示数据。
- View 不直接访问 Model,而是通过 Presenter 来获取数据。
3. MVVM (Model-View-ViewModel):
组成部分:
- Model (模型): 与 MVC 和 MVP 中的 Model 相同,负责处理应用程序的数据和业务逻辑。
- View (视图): 负责显示用户界面,并通过数据绑定 (Data Binding) 与 ViewModel 进行交互。 View 通常是被动的,只负责显示数据,不负责处理业务逻辑。
- ViewModel (视图模型): 负责从 Model 中获取数据,并将数据转换成 View 可以直接显示的形式。 ViewModel 还负责接收用户的输入,并根据用户的输入来更新 Model。 ViewModel 通过数据绑定将数据传递给 View,并监听 View 的事件。
交互方式:
- 用户与 View 交互。
- View 通过数据绑定将用户的操作传递给 ViewModel。
- ViewModel 根据用户的操作更新 Model。
- Model 数据发生改变后,通知 ViewModel。
- ViewModel 将数据转换成 View 可以直接显示的形式。
- ViewModel 通过数据绑定将数据传递给 View 进行显示。 (View 不直接访问 Model,而是通过 ViewModel 来获取数据,并且 ViewModel 的数据变化会自动更新到 View 上)
- View 根据 ViewModel 传递的数据进行更新。
优点:
- 职责分离: Model、View 和 ViewModel 各司其职,代码结构清晰。
- 可测试性: 由于职责分离,可以更容易地对 Model 和 ViewModel 进行单元测试。
- 可维护性: 代码结构清晰,易于维护和修改。
- View 和 Model 解耦: View 不直接访问 Model,而是通过 ViewModel 来获取数据,降低了 View 和 Model 之间的耦合度。
- 代码量减少: 通过数据绑定,可以减少大量的样板代码。
- 双向数据绑定: ViewModel 的数据变化会自动更新到 View 上,View 的事件也会自动传递给 ViewModel。
缺点:
- 学习成本较高: 需要学习数据绑定相关的知识。
- 调试困难: 数据绑定可能会导致调试困难。
- ViewModel 过于庞大: 如果 View 过于复杂,ViewModel 可能会变得非常庞大。
适用场景:
- UI 逻辑复杂的应用程序。
- 需要进行单元测试的应用程序。
- 使用数据绑定的应用程序。
理解要点:
- ViewModel 是核心,负责协调 Model 和 View。
- View 是被动的,只负责显示数据。
- View 不直接访问 Model,而是通过 ViewModel 来获取数据,并且 ViewModel 的数据变化会自动更新到 View 上 (双向数据绑定)。
- 数据绑定是 MVVM 的核心特性。
总结:
| 特性 | MVC | MVP | MVVM |
|---|---|---|---|
| 核心组件 | Controller | Presenter | ViewModel |
| View 与 Model | View 可以直接访问 Model | View 不直接访问 Model,通过 Presenter | View 不直接访问 Model,通过 ViewModel |
| 数据绑定 | 无 | 无 | 有 (双向数据绑定) |
| 测试性 | 相对较差 | 较好 | 较好 |
| 复杂性 | 简单 | 中等 | 复杂 |
| 代码量 | 较少 | 中等 | 中等 (但减少了样板代码) |
选择哪种架构模式?
- MVC: 适用于简单的应用程序,UI 逻辑不复杂。
- MVP: 适用于 UI 逻辑复杂的应用程序,需要进行单元测试。
- MVVM: 适用于 UI 逻辑复杂的应用程序,需要进行单元测试,并且使用数据绑定。
在 Android 开发中,MVP 和 MVVM 是更常见的选择,因为它们更好地支持单元测试,并降低了 View 和 Model 之间的耦合度。 MVVM 尤其受到青睐,因为它利用数据绑定技术,减少了大量的样板代码。


