Android: MVC MVP MVVM

在第二篇博客中,用MVP实现手机号码归属地查询APP:传送门 .并简单提了一下MVC与MVP.

imooc课程学习总结


 Android: MVC MVP MVVM_第1张图片

传统模式下实现一个简单的功能,Activity需要写很多代码:

NormalActivity:

package com.yinlei.mvcdemo.normal

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import com.yinlei.mvcdemo.R
import com.yinlei.mvcdemo.bean.Account
import com.yinlei.mvcdemo.callback.MCallBack
import kotlinx.android.synthetic.main.activity_normal.*
import kotlin.random.Random

class NormalActivity : AppCompatActivity(), View.OnClickListener{
    override fun onClick(v: View?) {
        val userInput=getUserInput()
        getAccountData(userInput, object : MCallBack {
            override fun onSuccess(account: Account) {
                showSuccessPage(account)
            }

            override fun onFailed() {
                showFailPage()
            }
        })
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_normal)
        btnGetAccount.setOnClickListener(this)
    }

    /**
     * 获取用户输入的信息
     */
    private fun getUserInput(): String = EtAccount.text.toString()

    /**
     * 展示获取数据成功的界面
     */
    private fun showSuccessPage(account: Account){
        TvResult.text = "用户账号:${account.name} | 用户等级: ${account.level}"

    }

    /**
     * 展示获取数据失败的界面
     */
    private fun showFailPage(){
        TvResult.text = "获取数据失败"
    }

    /**
     * 查询账号数据
     */
    private fun getAccountData(accountName: String,callback: MCallBack){
        var isSuccess = Random.nextBoolean()
        if(isSuccess){
            val account = Account(accountName,100)
            callback.onSuccess(account)
        }else{
            callback.onFailed()
        }
    }
}

Activity看起来十分臃肿,它包含了view的展示与相关逻辑的处理,假设添加一个新的功能,就需要再“填鸭式”。这些像藕丝一样。


MVC:

MVC: Model View Controller  模型 - 视图- 控制器

 Controller: 主要代表Activity Fragment

View: layout、View控件

Model: 数据处理(网络请求,SQL等)

 

Android: MVC MVP MVVM_第2张图片

对于他们的事件传递:

controller->Model: 可以让controller持有model的引用。

model-> view: 一般不直接让model持有view的引用,使用注册监听的方式实现Callback.

Android: MVC MVP MVVM_第3张图片

Android: MVC MVP MVVM_第4张图片

Android: MVC MVP MVVM_第5张图片

 

优点:

一定程度上实现了Model与View的分离,降低了代码的耦合性

缺点:

Controller与View难以完全解耦,并且随着项目的复杂度的提升,Controller越来越臃肿

就上面的代码而言,

controller与view难以完全解耦(activity既是控制器,又要承担部分的视图层的工作),activity太过臃肿,还承担部分业务逻辑。

所以 mvc 大致是:model < === > View/Controller


MVP:

Android: MVC MVP MVVM_第6张图片

Android: MVC MVP MVVM_第7张图片

MVP: Model-View-Presenter模型

view指代acitvity、fragment

Presenter:连接model与view的纽带。

V层:

Android: MVC MVP MVVM_第8张图片

 

Android: MVC MVP MVVM_第9张图片

M层:

Android: MVC MVP MVVM_第10张图片

P层:

Android: MVC MVP MVVM_第11张图片

优点:

解决了mvc中controller与view过度耦合的缺点。职责划分明显。更加容易维护。

缺点:

接口数目多,project的复杂度高。presenter层将更臃肿。


DataBinding:[jetpack的组件]传送门

 Google官方发布的一个实现数据绑定的框架(实现数据与视图的双向绑定),帮助在android中更好的实现mvvm模式

即是实现mvvm的工具。

支持很好了,以前还build project、xml提示等现在都好很多

使用:【具体可查阅android developer 的jetpack的组件】

  • 启用databinding
  • 修改布局文件为databinding布局
  • 数据绑定

Android: MVC MVP MVVM_第12张图片

Android: MVC MVP MVVM_第13张图片

Android: MVC MVP MVVM_第14张图片

Android: MVC MVP MVVM_第15张图片


MVVM:

Model <==> ViewModel <==> View

将presenter替换成了Viewmodel..

MVVM: model -view-viewmodel 。在mvp的基础上实现了数据视图的绑定(databinding),当数据变化时,视图自动更新。当视图变化时,数据也会自动更新。

这种思想,在前端中的vue框架中就很好的体现双向绑定。

使用MVVM实现需求:
提供View,ViewModel以及Model层
将布局文件修改Databinding布局
View与ViewModel之间通过DataBinding进行通信
获取数据并展示在界面上

优点:

实现了数据和视图的双向绑定,极大的简化代码。

缺点:bug难以调试,databinding还存在一些编译问题,比如BR

 建议与Jetpack的组件进行配合+kotlin.

LiveData+ViewModel:

LiveData: 一个可以被观察的数据持有者,可以通过添加观察者的方式让其他组件观察他的变更。

LiveData:遵从应用程序的生命周期,如果LiveData的观察者已经被销毁了,livedata就不会通知该观察者 

代码:

github: https://github.com/LeiLeiOfJava/Android-MVC-MVP-MVVM

你可能感兴趣的:(Android)