[悖论]MVC、MVP、MVVM有优劣之别吗

MVC、MVP与MVVM对比
本文探讨MVC、MVP与MVVM三种架构模式的适用场景,而非简单评判优劣。作者认为,模式的选择应基于项目需求,如简单页面适配MVC,复杂页面API调用多则推荐MVP,而MVVM适用于API变动大但UI稳定的情况。

偶然间,看到一个说法:AJAX是针对MVC的,不符合MVVM的浪潮。

引发了一个思考:MVC、MVP、MVVM有优劣之别吗?

过往面试也曾有人问我这个问题。
本文的目的,不是介绍MVC、MVP、MVVM是什么了。
MVP较MVC出现的晚,的确也是因为某些缺陷出现了这样的方案,MVVM又因为MVP的某些缺陷出现。

究竟孰优孰劣?笔者的观点:这本身就是个错误的思考点,一个埋雷的坑。

若MVC<MVP<MVVM,假定顺序是这样的。
那么,你就应该通盘采用有较大优势的一个。

笔者认为,这MVC、MVP、MVVM没有任何优劣可比。仅仅只是适用的场景不一样罢了。
  • 场景一:打开一个页面,简单的请求某个string,然后,显示出现。

    • 谁愿意用MVP、MVVM。我第一选择是用一个最简洁的类 extends 某BaseMVC,直接了解的,调用设置。一个文件足矣。
    • 倘若用MVP,你是不是起码得4个文件。类的数量多了。维护成本变高,你难道不累?
  • 场景二:复杂页面,API调用多,但展示什么,逻辑还是蛮清晰的。

    • 你当然不应该用MVC,这样显得Activity极其庞大。
    • 用Contract定义接口。确实会显得更清晰。
  • 场景三:复杂页面,API调用多,关键是某些API变,Response值多样,但页面却不大动。

    这个时候,你又选择什么呢?
MVC、MVP、MVVM是编程技巧,并没有什么优劣之分,差异的是使用场景。

我认为大部分时候,你不会用到MVVM,因为这种场景少。能出现这种场景,我相信,后端或者产品设计需要优化了。
在平时研发过程中,我更多的会结合MVC、MVP的使用,速战速决。一个页面,除了UI费时,接口对接的耗时,可以得到很大的压缩。

同样的道理,设计模式有很多,但是有一个叫混合模式。

### MVCMVPMVVM架构模式的对比及优缺点 在Android开发中,MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)是三种常见的架构模式,它们的目标是通过分层设计来提升应用程序的可维护性和可测试性。以下是对这三种架构模式的详细比较: #### MVC(Model-View-Controller) MVC是一种经典的软件架构模式,其核心思想是将数据模型(Model)、用户界面(View)和控制逻辑(Controller)分离。这种模式适用于中小型项目,因为它的结构相对简单,但在大型应用中可能导致Controller臃肿[^1]。 - **优点**: - 结构清晰,易于理解。 - 分离了数据处理与UI显示,使得代码组织更合理。 - Controller负责协调Model和View之间的交互,有利于业务逻辑的集中管理。 - **缺点**: - 在复杂的场景下,Controller可能会变得非常庞大且难以维护。 - View直接依赖于Model,导致两者之间耦合度较高,不利于单元测试。 #### MVP(Model-View-Presenter) MVP是对MVC的一种改进形式,它进一步降低了View对Model的依赖,并引入了Presenter作为中间人来处理所有的交互逻辑。这种模式非常适合需要高度解耦的应用程序,尤其是那些重视单元测试覆盖率的项目[^2]。 - **优点**: - Presenter不持有任何Android框架对象,便于进行单元测试。 - View仅暴露必要的接口给Presenter调用,减少了View与Model之间的耦合。 - 更好的分离关注点,提高了代码的复用性和可维护性。 - **缺点**: - 需要为每个View定义接口,增加了额外的工作量。 - 对于简单的应用场景来说可能显得过于复杂。 #### MVVM(Model-View-ViewModel) MVVM利用数据绑定机制实现了View与ViewModel之间的自动同步,从而减少了手动更新UI的需求。它是现代Android开发中最推荐使用的架构模式之一,特别是当结合LiveData或StateFlow等响应式编程组件时效果更佳[^5]。 - **优点**: - 双向数据绑定简化了UI更新流程,提升了开发效率。 - ViewModel提供了一个抽象层,使得UI控制器更加轻量级。 - 支持声明式的数据流,有助于构建更加健壮和灵活的应用。 - **缺点**: - 初学者学习曲线较陡峭,尤其是对于不熟悉数据绑定概念的新手。 - 如果不当使用数据绑定,可能导致性能问题或者内存泄漏的风险。 ### 示例代码 下面是一个简化的MVVM示例,展示如何使用ViewModel和LiveData来管理UI相关的数据: ```kotlin class MyViewModel : ViewModel() { private val _text = MutableLiveData<String>().apply { value = "Hello World" } val text: LiveData<String> get() = _text } // 在Activity中观察ViewModel中的LiveData val viewModel: MyViewModel by viewModels() viewModel.text.observe(this, Observer { textView.text = it }) ``` 这段代码展示了MVVM的一个关键特性——即ViewModel如何通过LiveData向View层传递信息,同时保持低耦合度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值