android - MVC 与 MVP 与 MVVM 用例

标签 android model-view-controller mvvm architecture mvp

我是一名 Android 开发人员,我在我的应用程序中使用过所有这三种架构模式。此外,我还浏览了关于 stackoverflow 的几篇关于每个帖子的区别的帖子。我的理解可能不是 100% 正确,但这是我目前所知道的简要情况。

  1. MVC - Controller 接收用户输入。 Controller 更新模型,然后通知 View 更新自身。

  2. MVP - View 获取用户输入并通知 Presenter。 Presenter从Model中获取数据,然后发送给View。 Presenter 和 View 是一对一的关系。

  3. MVVM - View 接收用户输入。 ViewModel 从 Model 生成数据并输出数据流,任何订阅它的 View 都可以使用该数据。 View 和 ViewModel 是一对多的关系。

问题是在面试中我多次被问及何时使用哪种模式。我认为面试官想知道的是应用程序的类型(如银行、电子商务等)及其合适的架构模式。或者至少一些关于为什么我想在一个应用程序中使用 MCV 而在另一个应用程序中使用 MVP 以及 MVVM 的具体解释。

我做了很好的研究,但在互联网上找不到任何合适的答案来讨论每种模式的用例。因此,请求请告诉我每个的用例。

最佳答案

据我所知:

MVC:Model View Controller 是传统的 Android 开发方式。这个在Android开发刚开始的时候用过,用了几年。当时,唯一广为人知的模式是 MVC。

因此,大多数旧应用程序都是从 MVC 开始的,但随着代码库的增加, Controller (Activities/Fragments)变得庞大,其中包含大量业务逻辑和网络请求以及异步任务。因此,由于三者之间的高度依赖性,此类应用程序变得难以超时维护并且非常难以测试。

因此,如果您的应用程序非常小并且您不想遵循新的架构模式或者对那些使用 MVC 的架构模式了解为 0,但我强烈建议此时不要遵循 MVC。

MVP -> 随着 MVC 应用程序变得难以维护和测试,应用程序转向 MVP。

Model View Presenter 试图解决 MVC 的问题,并将表示和业务逻辑移至 Presenter。这里的演示者只是执行界面操作,并不知道它正在尝试更新的 View 。因此,由于演示器与 Controller 不相似,我们可以轻松地测试演示器和模型。因此,我们实现了测试和维护的好处,但它也产生了一个问题,即现在的演示者是聪明的。他们最终开始变得笨重。创建一个类似的问题。

同样在 android 中,应用程序需要维护应用程序状态。 MVC 和 MVP 并不是开箱即用的状态保存功能,您需要编写额外的代码来维护状态。

另一方面,

MVVM 最受欢迎。模型 View viewModel 是新的 android 架构。

你可以去详细了解一下:

https://developer.android.com/jetpack/docs/guide

网络连接存在于存储库中。因此,您的 fragment 或 Activity 中的代码更加清晰。所有三个组件都易于测试和维护。

最大的优势之一是您可以获得性能优势,因为它具有开箱即用的状态保存机制,因为 ViewModel 遵循单例模式,您可以通过使用 ViewProviders 并通过它创建实例来实现这一点。

当你说什么应用程序应该使用什么。如果应用程序规模庞大且复杂,则强烈建议使用 MVVM,您还可以查看其他流行的架构组件,如 MVI 和干净的架构(基于用例)。在我看来,应用产品类型不会改变架构需求。决定它的是复杂性和规模。您的安全要求因产品而异。

关于android - MVC 与 MVP 与 MVVM 用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54106509/

相关文章:

java - 这是在 Java 中处理事件的好方法吗?

wpf - 在Wpf MVVM中使用非贫血症域模型

android - 设备锁定时如何显示 Activity ?

android - 在 Realm 数据库中过滤 - findAll 不适用于包含 boolean 值的查询

android - 尽管有明确请求,但无法从 Google Plus 帐户获取私有(private)生日

android - 缺少主调度程序的模块

wpf - 不清楚如何实现依赖注入(inject)

java - findFirstVisibleItemPosition 不适用于 recyclerview android

c# - 如何编码和解码 splinter 的中文/Unicode字符?

c++ - 在 C++ 桌面应用程序的上下文中使用 MVC 的导航/ View 流