1. 程式人生 > 其它 >MVC,MVP,MVVM的區別及ViewModel的使用

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


以上是沒有引數的建構函式的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:獲取物件及資料方法和沒有引數的一樣