0%

设计模式(二):MVC/MVP/MVVM 三种应用架构模式总结

1. MVC 模式

  • 历史:

    • 最早由 Trygve Reenskaug 于 1978 年在 Smalltalk-80 系统上首次提出的一种软件设计模式
  • 定义:

    • Model(模型层):针对业务模型,建立的数据结构和相关的类。主要负责网络请求、数据库处理、I/O 等操作
    • View(视图层):一般采用 XML 文件或者 Java 代码进行界面的描述,也可以使用 JavaScript+HTML 等方式作为 View 层
    • Controller(控制层):Android 的控制层通常在 Activity、Fragment 或由它们控制的其他业务类中。这些类主要是作为初始化页面,展示数据的操作,但是因为 XML 视图功能太弱,所以 Activity 既要负责视图的显示又要加入控制逻辑,承担的功能过多
  • 特点:

    • Activity 并不是一个标准的 MVC 模式中的 Controller,它的首要职责是加载应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而做出响应。随着界面及其逻辑复杂度的不断提升,Activity 类的职责不断增加,以致变得庞大臃肿
    • View 层和 Model 层相互耦合,不易开发和维护

2. MVP 模式

  • 历史:

    • MVP 是 MVC 的演化版本
  • 定义:

    • Model:主要负责数据的存取功能。Presenter 需要通过 Model 层来存储、获取数据
    • View:负责处理用户事件和视图部分的展示。在 Android 中,它可能是 Activity、Fragment 或者是某个 View 控件
    • Presenter:作为 View 和 Model 之间沟通的桥梁,它从 Model 层检索数据后返回给 View 层,使得 View 和 Model 之间没有耦合
  • 特点:

    • 在 MVP 里,Presenter 完全将 Model 和 View 进行了分离,主要的程序逻辑在 Presenter 里实现
    • Presenter 与具体的 View 是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更 View 时可以保持 Presenter 的不变,这点符合面向接口编程的特点
    • View 层理想情况下应该有简单的 set/get 方法,以及用户输入和设置界面显示的内容,除此之外就不应该有更多的内容。不允许 View 直接访问 Model,这是其与 MVC 的很大不同之处
  • 参考:

  • 应用:

3. MVVM 模式

  • 历史:

    • Data Binding 官方介绍
    • 最早于 2005 年由微软的 WPF 和 Silverlight 的架构师 John Gossman 提出,将 Presenter 改为 ViewModel
    • 2015 年 Google I/O 大会,Google 发布了 MVVM 架构模式的支持库 Data Binding
  • 定义:

    • 和 MVP 类似,不同的是 ViewModel 和 View 进行双向绑定
    • 当 View 发生改变时,ViewModel 通知 Model 进行更新数据;同理 Model 数据更新后,ViewModel 通知 View 更新
    • 通过 Dada Binding,我们可以通过声明式布局以精简的代码来绑定应用程序的逻辑和布局,这样就不用编写大量的类似 findViewById() 这样的模板代码了
  • 特点:

    • 在默认情况下,Binding 辅助类的名称取决于布局文件的命名,其以大写字母开头,移除下划线,后续的单词首字母大写并以 Binding 结尾,比如 ActivityMainBinding。辅助类包含了布局文件中所有的绑定关系,并会根据绑定表达式给布局文件赋值
    • 动态更新:Data Binding 提供了 3 种动态更新机制,根据 Model 实体类的内容来动态更新 UI,分别对应于类(Observable)字段(ObservableField)集合类型(Observable 容器类)。通过动态更新机制,当 Model 发生变化时,就会通知 ViewModel 对 View 进行动态更新
    • 双向绑定:Data Binding 在 Android Studio 2.1 Preview 3 版本之后,开始支持双向绑定,即如果 UI 发生变化,Model 实体类实现动态更新,前提是需要结合动态更新机制
  • 参考:

  • 应用:

-------------------- 本文结束感谢您的阅读 --------------------