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:获取对象及数据方法和没有参数的一样

       

posted @ 2021-07-01 15:02  哎睡的懒洋洋  阅读(310)  评论(0编辑  收藏  举报