zoukankan      html  css  js  c++  java
  • MVC,MVP,MVVM的区别及ViewModel的使用

    MVC:

        M:数据model

        V:视图View

        C:controller

    要实现view上面的各种操作,需要一些逻辑处理,而MVC模式就是将所有操作都放在controller里面写

      比如我们在activy_main.xml中需要在某一控件a上面添加一些东西,而只有当a上面为空时才能添加,那么

       这时候需要判断a是否为空,若为空则添加数据,不为空则做其他操作。mvc模式则是将这全部过程(包括

       什么时候操作这样的逻辑处理,以及添加数据这样的对视图的处理)都放在 MainActivity(controller)里面

      写,这样的模式就是MVC模式。

    MVP:

         M:数据model

        V:视图View

        P:Presenter(对视图操作的逻辑的处理)

        MVP就是在数据Model与视图View之间加了一个P(presenter)用于对视图逻辑上的处理,而视图就只负责

            视图自己的处理,比如添加数据,变亮变暗等,

        比如我们在activy_main.xml中需要在某一控件a上面添加一些东西,而只有当a上面为空时才能添加,那么

           这时候需要判断a是否为空,若为空则添加数据,不为空则做其他操作。那么对于视图的逻辑的处理就是判

           端该视图是否为空,而View只负责添加数据,至于什么时候添加数据就有Presenter来决定。

    MVVM:

        M:数据model

        V:视图View

        VM:ViewModel

        MVVM,就是在model和View之间增加一层ViewModel,将数据经过ViewModel处理之后,在拿到View上去显示,经过

    ViewModel处理的数据,其生命周期和界面的生命周期是一样的,这就简化了我们需要对界面中数据生命周期需求的处理,

     比如我们在activy_main.xml中需要在某一控件a上面添加一些东西b,但是希望b能够在a上面一直存在,就算a所在界面被

    重启,b依然存在,但同时如果a所在界面被销毁,那么b就消失了,那么这时就需要使用ViewModel。另一种情况,若b的数

    据是在改变的,一般情况都会使用callback函数回调或者接口,用ViewModel中的LiveData就不需要函数的回调,LiveData管理

    的就是活的数据,当LiveData中的数据被改变时,同时视图中的数据也会相应的改变。

    ViewModel的使用:

        1:导入依赖库:

    dependencies {
    // ViewModel
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1")
    // LiveData
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.3.1")
    .......
    }
    2:建立一个类继承与ViewModel,在里面进行数据处理
    在ViewModel里面所得的数据就直接和对应的界面的生命周期是一样的
    class NetWork :ViewModel(){
    val content1 = 20
    //mutable可变的,表示里面的内容是可变的 LiveData对象
    val content:MutableLiveData<String> = MutableLiveData()

    }

    3:在外部获取ViewModel对象

     /*
    通过ViewModelProvider(this).get(MyViewModel::class.java)来获取viewmodel这个对象
    必须要通过ViewModelProvider来取得ViewModel这个对象,ViewModelProvider里面包含了
    lifeowner(生命周期的监听者),但是这个方法只能用来创造没有没有构造函数的ViewModel,
    若是有其他的需求,如ViewModel里面包含了构造函数的,就只能自定义ViewModelProvider,
    ViewModel所保存的数据是随着整个页面的生命周期的
    */
    val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    //通过对象访问数据就行
    mtextView.text = viewModel.content1
    //这个是管理活着的数据,也就是动态数据,(LiveData类型的数据)通过Observe来进行观察
        val viewModel = ViewModelProvider(this).get(NetWork::class.java)
    viewModel.content.observe(this, Observer {
    //this,是谁要来观察,it是content的内容,当content的内容一旦改变
    //会将it值传过来,需要做什么
    //和callback的作用是一样的,但是数据一多就需要定义多个callback,这个就不需要
    mtextView.text = it
    })
    }


    以上是没有参数的构造函数的ViewModel类的使用,下面是有参数的构造函数的(都需要导入依赖库)

    1:建立一个类继承与ViewModel,在里面进行数据处理
    class MyViewModel(content:String):ViewModel() {
    var content1="android+$content"
    }
    2:建立一个类继承与ViewModelProvider.NewInstanceFactory,实现其create方法,其中
    返回的“aaaaaaa”就是传入ViewModel()中构造函数里面的参数
    class ViewModelProviderFactory: ViewModelProvider.NewInstanceFactory() {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    return MyViewModel("aaaaaaaaa") as T
    }
    }
    3:获取对象及数据方法和没有参数的一样

           

  • 相关阅读:
    JWT有这么难嘛?
    Mybatis一级缓存和二级缓存区别
    redis学习笔记
    基于Redission框架实现redis 分布式锁
    C# lambda 学习笔记
    C# 读取 ttf字体文件里的 Unicode
    网页调试控制台Preview乱码,但是正常显示
    uniapp 自定义组件 列表视图不更新问题
    asp.net core 允许跨域
    asp.net core asp-controller不生效
  • 原文地址:https://www.cnblogs.com/luofangli/p/14958799.html
Copyright © 2011-2022 走看看