Android:MVC、MVP、MVVM模式的详解

打印 上一主题 下一主题

主题 1016|帖子 1016|积分 3048

在 Android 开辟中,MVC(Model-View-Controller)、MVP(Model-View-Presenter)和 MVVM(Model-View-ViewModel)是三种常见的架构模式。每种模式都有其独特的优缺点和适用场景。以下分别通过结构、工作流程、优缺点,对这三种模式详细比力息争释的整理。
1. MVC(Model-View-Controller)

结构



  • Model: 负责应用步伐的数据和业务逻辑。
  • View: 负责表现数据(UI),并向用户展示信息。
  • Controller: 处理用户输入,更新 Model 和 View。
工作流程


  • 用户与 View 交互(例如,点击按钮)。
  • View 将用户输入通报给 Controller。
  • Controller 更新 Model。
  • Model 关照 View 更新(通常通过回调或观察者模式)。
优点



  • 简单易懂,得当小型应用。
  • 直接的用户交互和数据更新。
缺点



  • 随着应用复杂度增长,Controller 大概变得臃肿。
  • View 和 Controller 之间的耦合度较高。
  • MVC 示例中,Activity 直接与 Model 和 View 交互,得当简单的应用。
MVC 示例:

在 MVC 模式中,Activity 充当 Controller,负责与 Model 和 View 交互。
  1. // Model
  2. class CounterModel {
  3.     var count: Int = 0
  4. }
  5. // MainActivity (Controller)
  6. class MainActivity : AppCompatActivity() {
  7.     private lateinit var model: CounterModel
  8.     override fun onCreate(savedInstanceState: Bundle?) {
  9.         super.onCreate(savedInstanceState)
  10.         setContentView(R.layout.activity_main)
  11.         model = CounterModel()
  12.         val countTextView: TextView = findViewById(R.id.countTextView)
  13.         val incrementButton: Button = findViewById(R.id.incrementButton)
  14.         incrementButton.setOnClickListener {
  15.             model.count++
  16.             countTextView.text = "Current Count: ${model.count}"
  17.         }
  18.     }
  19. }
复制代码
结构文件 (res/layout/activity_main.xml):
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent"
  4.     android:orientation="vertical"
  5.     android:gravity="center">
  6.     <TextView
  7.         android:id="@+id/countTextView"
  8.         android:layout_width="wrap_content"
  9.         android:layout_height="wrap_content"
  10.         android:text="Current Count: 0"
  11.         android:textSize="24sp" />
  12.     <Button
  13.         android:id="@+id/incrementButton"
  14.         android:layout_width="wrap_content"
  15.         android:layout_height="wrap_content"
  16.         android:text="Increment" />
  17. </LinearLayout>
复制代码


  • MVC 示例中,Activity 直接与 Model 和 View 交互,得当简单的应用。
2. MVP(Model-View-Presenter)

结构



  • Model: 负责数据和业务逻辑。
  • View: 负责 UI 表现,通常是一个接口。
  • Presenter: 处理用户输入,更新 Model 和 View。
工作流程


  • 用户与 View 交互。
  • View 将用户输入通报给 Presenter。
  • Presenter 更新 Model。
  • Model 关照 Presenter 数据变化。
  • Presenter 更新 View。
优点



  • View 和 Presenter 之间的解耦,便于单位测试。
  • Presenter 可以处理复杂的业务逻辑。
缺点



  • 需要编写额外的接口和实现,增长了代码量。
  • 大概导致 Presenter 变得复杂。
MVP 示例:

在 MVP 模式中,Presenter 负责处理业务逻辑,View 只负责表现。
  1. // Model
  2. class CounterModel {
  3.     var count: Int = 0
  4. }
  5. // View Interface
  6. interface CounterView {
  7.     fun displayCount(count: Int)
  8. }
  9. // Presenter
  10. class CounterPresenter(private val view: CounterView, private val model: CounterModel) {
  11.     fun incrementCount() {
  12.         model.count++
  13.         view.displayCount(model.count)
  14.     }
  15. }
  16. // MainActivity (View)
  17. class MainActivity : AppCompatActivity(), CounterView {
  18.     private lateinit var presenter: CounterPresenter
  19.     private lateinit var countTextView: TextView
  20.     override fun onCreate(savedInstanceState: Bundle?) {
  21.         super.onCreate(savedInstanceState)
  22.         setContentView(R.layout.activity_main)
  23.         countTextView = findViewById(R.id.countTextView)
  24.         presenter = CounterPresenter(this, CounterModel())
  25.         val incrementButton: Button = findViewById(R.id.incrementButton)
  26.         incrementButton.setOnClickListener {
  27.             presenter.incrementCount()
  28.         }
  29.     }
  30.     override fun displayCount(count: Int) {
  31.         countTextView.text = "Current Count: $count"
  32.     }
  33. }
复制代码
结构文件 (res/layout/activity_main.xml):
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent"
  4.     android:orientation="vertical"
  5.     android:gravity="center">
  6.     <TextView
  7.         android:id="@+id/countTextView"
  8.         android:layout_width="wrap_content"
  9.         android:layout_height="wrap_content"
  10.         android:text="Current Count: 0"
  11.         android:textSize="24sp" />
  12.     <Button
  13.         android:id="@+id/incrementButton"
  14.         android:layout_width="wrap_content"
  15.         android:layout_height="wrap_content"
  16.         android:text="Increment" />
  17. </LinearLayout>
复制代码


  • MVP 示例中,Presenter 处理业务逻辑,View 只负责表现,得当中等复杂度的应用。
3. MVVM(Model-View-ViewModel)

结构



  • Model: 负责数据和业务逻辑。
  • View: 负责 UI 表现,通常是 Activity 或 Fragment。
  • ViewModel: 处理 UI 相干的数据,负责与 Model 交互。
工作流程


  • 用户与 View 交互。
  • View 通过数据绑定或观察者模式与 ViewModel 交互。
  • ViewModel 更新 Model。
  • Model 关照 ViewModel 数据变化。
  • ViewModel 更新 View(通过 LiveData 或其他观察者模式)。
优点



  • 数据绑定简化了 UI 更新。
  • View 和 ViewModel 之间的解耦,便于测试。
  • 更好的支持异步操作和数据流。
缺点



  • 学习曲线较陡,特别是对于数据绑定。
  • 大概导致 ViewModel 变得复杂。
MVVM 示例:

在 MVVM 模式中,ViewModel 负责处理 UI 相干的数据,使用 LiveData 来观察数据变化。
  1. // Model
  2. class CounterModel {
  3.     var count: Int = 0
  4. }
  5. // ViewModel
  6. class CounterViewModel : ViewModel() {
  7.     private val model = CounterModel()
  8.     val countLiveData = MutableLiveData<Int>()
  9.     fun incrementCount() {
  10.         model.count++
  11.         countLiveData.value = model.count
  12.     }
  13. }
  14. // MainActivity (View)
  15. class MainActivity : AppCompatActivity() {
  16.     private lateinit var viewModel: CounterViewModel
  17.     private lateinit var countTextView: TextView
  18.     override fun onCreate(savedInstanceState: Bundle?) {
  19.         super.onCreate(savedInstanceState)
  20.         setContentView(R.layout.activity_main)
  21.         countTextView = findViewById(R.id.countTextView)
  22.         viewModel = ViewModelProvider(this).get(CounterViewModel::class.java)
  23.         viewModel.countLiveData.observe(this, Observer { count ->
  24.             countTextView.text = "Current Count: $count"
  25.         })
  26.         val incrementButton: Button = findViewById(R.id.incrementButton)
  27.         incrementButton.setOnClickListener {
  28.             viewModel.incrementCount()
  29.         }
  30.     }
  31. }
复制代码
结构文件 (res/layout/activity_main.xml):
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent"
  4.     android:orientation="vertical"
  5.     android:gravity="center">
  6.     <TextView
  7.         android:id="@+id/countTextView"
  8.         android:layout_width="wrap_content"
  9.         android:layout_height="wrap_content"
  10.         android:text="Current Count: 0"
  11.         android:textSize="24sp" />
  12.     <Button
  13.         android:id="@+id/incrementButton"
  14.         android:layout_width="wrap_content"
  15.         android:layout_height="wrap_content"
  16.         android:text="Increment" />
  17. </LinearLayout>
复制代码


  • MVVM 示例中,ViewModel 使用 LiveData 观察数据变化,得当现代 Android 开辟,特别是与 Jetpack 组件结合使用。
总结



  • MVC 得当小型应用,简单易懂,但在复杂应用中大概导致 Controller 过于臃肿。
  • MVP 提供了更好的解耦和可测试性,得当中型应用,但需要更多的代码结构。
  • MVVM 是现代 Android 开辟的推荐模式,特别是与 Jetpack 组件(如 LiveData 和 ViewModel)结合使用时,能够提供更好的数据管理和 UI 更新机制。
选择哪种模式取决于你的应用需求、团队的认识程度以及项目的复杂性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表