MVC(Model-View-Controller)隔开业务和UI(一对一)
- 角色划分:
Model:负责处理数据和业务逻辑,通常包括数据的存储、检索和更新等操作。
View:负责展示用户界面,接收用户输入,并将用户操作传递给 Controller。
Controller:作为 Model 和 View 之间的中介,负责处理用户输入,调用 Model 进行数据处理,并更新 View 以反映数据的变化。 - 交互方式:
View 和 Model 之间存在直接的依赖关系。View 可以直接访问 Model 中的数据,并且在数据发生变化时,View 需要主动从 Model 中获取新的数据进行更新。
Controller 负责协调 View 和 Model 之间的交互。当用户在 View 上进行操作时,View 将事件传递给 Controller,Controller 再根据事件类型调用 Model 进行相应的业务处理,并更新 View。 - 优缺点:
优点:
结构简单,易于理解和实现。
可以将业务逻辑和用户界面分离,提高代码的可维护性。
缺点:
View 和 Model 之间的紧密耦合可能导致代码难以维护和测试。例如,当 Model 中的数据发生变化时,View 需要主动获取数据并更新自己,这增加了代码的复杂性。
Controller 可能会变得过于庞大和复杂,因为它需要处理所有的用户输入和业务逻辑。
- 主动式
- 被动式
MVP(Model-View-Presenter)
- 角色划分:
Model:与 MVC 中的 Model 类似,负责处理数据和业务逻辑。
View:只负责显示数据和接收用户输入,不包含任何业务逻辑。View 通常通过接口与 Presenter 进行交互。
定义接口,如UserListView,包含显示用户列表、显示加载进度、显示错误信息等方法。
Presenter:作为 View 和 Model 之间的中介,负责处理用户输入,调用 Model 进行数据处理,并更新 View。Presenter 通常包含大部分的业务逻辑。
实现UserListView接口中的方法,负责处理用户输入,调用 Model 进行数据处理,然后更新 View。 - 交互方式:
View 和 Model 之间完全解耦,通过 Presenter 进行间接交互。View 只需要将用户操作传递给 Presenter,Presenter 负责调用 Model 进行数据处理,并将结果返回给 View 进行显示。
Presenter 与 View 和 Model 都有联系。Presenter 接收来自 View 的用户输入,调用 Model 进行业务处理,并将结果更新到 View。同时,Presenter 也可以从 Model 中获取数据,并将其传递给 View 进行显示。 - 优缺点:
优点:
更好地实现了 View 和 Model 的解耦,使得代码更易于维护和测试。
Presenter 可以进行单元测试,而不需要依赖于 Android 框架,提高了测试的效率和可靠性。
缺点:
代码量相对较大,因为需要定义接口来实现 View 和 Presenter 之间的交互。
Presenter 可能会变得复杂,特别是当业务逻辑较多时。
MVVM(Model-View-ViewModel)
- 角色划分:
Model:与 MVC 和 MVP 中的 Model 类似,负责处理数据和业务逻辑。
View:负责显示数据和接收用户输入,不包含任何业务逻辑。View 通过数据绑定与 ViewModel 进行交互。
ViewModel:作为 View 和 Model 之间的桥梁,负责处理业务逻辑,并将数据以可观察的方式提供给 View。ViewModel 通常包含大部分的业务逻辑和数据处理代码。 - 交互方式:
View 和 Model 之间通过 ViewModel 进行间接交互。View 通过数据绑定机制自动更新显示的数据,而不需要手动从 ViewModel 中获取数据。当用户在 View 上进行操作时,View 将事件传递给 ViewModel,ViewModel 进行相应的业务处理,并更新数据,从而自动更新 View。
ViewModel 与 Model 进行交互,获取数据并进行处理,然后将处理后的数据以可观察的方式提供给 View。View 只需要关注数据的变化,而不需要关心数据的来源和处理过程。 - 优缺点:
优点:
实现了更好的 View 和 Model 的解耦,代码结构更加清晰,易于维护和测试。
数据绑定机制使得 View 的更新更加自动和高效,减少了手动更新 View 的代码量。
ViewModel 可以进行单元测试,而不需要依赖于 Android 框架。
缺点:
学习成本相对较高,需要掌握数据绑定等新的技术和概念。
对于复杂的界面和业务逻辑,ViewModel 可能会变得复杂,需要合理地组织代码。