前言#
這一篇準(zhǔn)備進(jìn)行一次總結(jié)舆绎,因?yàn)镸VVM的關(guān)鍵已經(jīng)之前講過(guò)了星立,就是DataBinding胞锰,所以用法就不提了阵子,還不了解的朋友可以去看:DataBinding學(xué)習(xí)系列。
正文#
<h2>MVVM</h2>
從命名可以看的出來(lái)胜蛉,僅僅是View層和Model層之前有著交互,有點(diǎn)類似與我們之前提到的MVC模式中去掉了Controller層色乾。在Android中誊册,典型的就是DataBinding,對(duì)View和Model進(jìn)行了中間隔離暖璧,這個(gè)中間層被稱作ViewModel案怯。下面就直接看例子:
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
app:image="@{@drawable/ic_launcher}"
android:background="@{@string/app_name}"/>
@BindingAdapter("bind:image")
public static void loadImage(ImageView image, Drawable resId){
image.setImageDrawable(resId);
}
這個(gè)例子我直接從之前的講解DataBinding中直接復(fù)制的,DataBinding通過(guò)自定義屬性(View)澎办,實(shí)現(xiàn)與之綁定的方法(Model)嘲碱,中間的具體怎么把自定義屬性和方法綁定在一起的過(guò)程就是ViewModel。這就是典型的MVVM模式局蚀。
的確是很方便麦锯,我們只要在MainActivity設(shè)置具體的參數(shù)就OK了。但是我們也看到琅绅,MVVM僅僅是View和Model之間的關(guān)系扶欣,并沒(méi)有涉及到具體的功能邏輯,所以在MVVM的基礎(chǔ)上又衍生出了MVPVM千扶。
<h2>MVPVM</h2>
就是在MVVM的基礎(chǔ)上增加了Presenter層料祠,負(fù)責(zé)處理功能邏輯。我們直接把之前的MVP模式進(jìn)行修改澎羞,使用DataBinding技術(shù)髓绽,就變成了MVPVM。
首先修改MainActivity:
public class MainActivity extends AppCompatActivity implements MainView, View.OnClickListener {
private MainPresenterImpl presenter;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setOnTextViewClickListener(this);
presenter = new MainPresenterImpl(this);
presenter.startLoading();
}
@Override
public void setText(String text) {
binding.setLoadingText(text);
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.onDestroy();
}
@Override
public void onClick(View v) {
presenter.showToast();
}
}
把之前的對(duì)View的操作全部交給ActivityMainBinding妆绞。Presenter層不變顺呕,接著為了突出MVVM的優(yōu)勢(shì)枫攀,我增加了一個(gè)appendText自定義屬性:
/**
* Created by li.zhipeng on 2017/3/24.
*
* MainActivity的Model
*/
public class MainModel {
/**
* 提供模擬的網(wǎng)絡(luò)請(qǐng)求類
* */
public static void login(final String name, final String pwd, final OnCallbackListener callbackListener){
new Thread(){
@Override
public void run() {
callbackListener.onLoading();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (name.equals("lzp") && pwd.equals("lzp")){
callbackListener.onSuccess();
}
else{
callbackListener.onFailed();
}
}
}.start();
}
@BindingAdapter("bind:appendText")
public static void appendText(TextView textView, String text){
textView.setText("對(duì)面的妹紙對(duì)我說(shuō):" + text);
}
}
OK這樣我們就修改完成了。
MVPVM與之前MVP相比塘匣,優(yōu)化了View和Model之間的關(guān)系脓豪,例如appendText屬性,如果不用DataBinding忌卤,我們肯定要在Presenter中定義方法扫夜,調(diào)用Model的appendText()來(lái)處理字符串,處理結(jié)束之后驰徊,再調(diào)用View的setText()方法笤闯。這里通過(guò)DataBinding作為中介,讓Model間接操作了TextView棍厂。
我按照我的理解簡(jiǎn)單的畫(huà)了一下架構(gòu)圖:
總結(jié)#
到這里我們已經(jīng)介紹了MVC颗味、MVP、MVVM牺弹、MVPVM等常用的架構(gòu)模式浦马,也看到了這些架構(gòu)都是在某一個(gè)基礎(chǔ)上進(jìn)行延伸、細(xì)分张漂,然后產(chǎn)生出新的模式晶默,不同的理解和劃分,設(shè)計(jì)出的結(jié)構(gòu)也會(huì)有所不同航攒。
從OOAD的設(shè)計(jì)原則來(lái)分析磺陡,他們都是面向?qū)ο笤O(shè)計(jì),然后進(jìn)行功能細(xì)分漠畜,例如邏輯層币他,顯示層等等,他們都是被看做某一個(gè)具體的事物憔狞,然后把對(duì)應(yīng)的任務(wù)的交給他蝴悉,跟日常生活中的分工都是類似的,不能出現(xiàn)不想當(dāng)廚師的司機(jī)不是好裁縫的情況躯喇。
所以我們不能被所謂的架構(gòu)模式蒙蔽雙眼辫封,就好像666的張三豐電影里說(shuō)的:記住要領(lǐng),忘記招式廉丽,你就真正的學(xué)會(huì)太極了倦微。