【公眾號回復「1024」,送你一個特別推送】
前言MVC是Model-View-Controller的縮寫,它將應用程式劃分為三個部分:
MVC優點:實現關注點分離,即應用程式中的數據模型與業務和展示邏輯解耦。在客戶端開發中,就是將模型(M-數據、操作數據)、視圖(V-顯示數據的HTML元素)之間實現代碼分離,鬆散耦合,使之成為一個更容易開發、維護和測試的客戶端應用程式。
MVC缺點:不適合小型,中等規模的應用程式,花費大量時間將MVC應用到規模並不是很大的應用程式通常會得不償失。
視圖與控制器間過於緊密連接,視圖與控制器是相互分離,但卻是聯繫緊密的部件,視圖沒有控制器的存在,其應用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。
視圖對模型數據的低效率訪問,依據模型操作接口的不同,視圖可能需要多次調用才能獲得足夠的顯示數據。對未變化數據的不必要的頻繁訪問,也將損害操作性能
MVPMVP(Model-View-Presenter)是MVC的改良模式,由IBM的子公司Taligent提出。和MVC的相同之處在於:Controller/Presenter負責業務邏輯,Model管理數據,View負責顯示只不過是將 Controller 改名為 Presenter,同時改變了通信方向。
MVP特點:M、V、P之間雙向通信。
View 與 Model 不通信,都通過 Presenter 傳遞。Presenter完全把Model和View進行了分離,主要的程序邏輯在Presenter裡實現。
View 非常薄,不部署任何業務邏輯,稱為」被動視圖」(Passive View),即沒有任何主動性,而 Presenter非常厚,所有邏輯都部署在那裡。
Presenter與具體的View是沒有直接關聯的,而是通過定義好的接口進行交互,從而使得在變更View時候可以保持Presenter的不變,這樣就可以重用。不僅如此,還可以編寫測試用的View,模擬用戶的各種操作,從而實現對Presenter的測試–從而不需要使用自動化的測試工具。
MVP優點:模型與視圖完全分離,我們可以修改視圖而不影響模型;
可以更高效地使用模型,因為所有的交互都發生在一個地方——Presenter內部;
我們可以將一個Presenter用於多個視圖,而不需要改變Presenter的邏輯。這個特性非常的有用,因為視圖的變化總是比模型的變化頻繁;
如果我們把邏輯放在Presenter中,那麼我們就可以脫離用戶接口來測試這些邏輯(單元測試)。
MVP缺點:視圖和Presenter的交互會過於頻繁,使得他們的聯繫過於緊密。也就是說,一旦視圖變更了,presenter也要變更。
MVVMMVVM是Model-View-ViewModel的簡寫。主要目的是分離視圖(View)和模型(Model)
MVVM優點:低耦合,視圖(View)可以獨立於Model變化和修改,一個ViewModel可以綁定到不同的」View」上,當View變化的時候Model可以不變,當Model變化的時候View也可以不變。
可重用性,可以把一些視圖邏輯放在一個ViewModel裡面,讓很多view重用這段視圖邏輯。
獨立開發,開發人員可以專注於業務邏輯和數據的開發(ViewModel),設計人員可以專注於頁面設計,使用Expression Blend可以很容易設計界面並生成xml代碼。
可測試,界面向來是比較難於測試的,而現在測試可以針對ViewModel來寫。
DataBinding是Google在2015年7月發布的Android Studio v1.3.0 版本上引入的,在2016年4月Android Studio v2.0.0 上正式支持。引入之初,不支持雙向綁定,目前已經支持了。
DataBinding 是基於MVVM思想實現數據和UI綁定的的框架,有了 Data Binding,在Android中也可以很方便的實現MVVM。
在引入DataBinding之前,我們需要敲很多很雞肋的代碼,如 findViewById()、setText(),setVisibility(),setEnabled() 或 setOnClickListener() 等,通過 Data Binding , 我們可以通過聲明式布局以精簡的代碼來綁定應用程式邏輯和布局,這樣就不用編寫大量的毫無營養的代碼了。
DataBinding使用1、在使用的module的build.gradle中加入android {
dataBinding {
enabled true
}
}
可用ObservableField,也可以用LiveData,官方推薦LiveData,LiveData會遵從其他應用組件(如activity,fragment)的生命周期,它只會在UI組件處在active狀態(如activity處在started和resumed )時才會推送數據。這樣避免了我們UI展示數據時,需要檢查下組件是否存在。具體後續說明。這裡demo用的ObservableField.。
public class UserBean {
public ObservableFieldname =new ObservableField<>();
public ObservableFieldage =new ObservableField<>();
public ObservableFieldsex =new ObservableField<>();
}
布局文件根標籤是layout。layout中包含data標籤,以及view。data部分是對應使用model。import說明是哪個具體的數據類,可定義alias 別名。variable定義變量,給view中引用,type為變量的類型。
4、在activity中使用MainMvvmBinding 這個是根據布局文件自動生成的,布局文件命名為main_mvvm,則生成MainMvvmBinding,如果命名為activity_main,則生成ActivityMainBinding。
public class MainActivityextends AppCompatActivity {
private MainMvvmBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.main_mvvm);
UserBean userBean =new UserBean();
userBean.name.set("張三");
userBean.age.set(28);
userBean.sex.set("男");
binding.setUser(userBean);
}
}
項目demo代碼可見:
https://github.com/feb07/MVVMProject
通過dataBinding 實現mvvm模式,使得數據和UI綁定,代碼更加簡潔,大大的減少了代碼量。通過 Data Binding , 我們可以通過聲明式布局以精簡的代碼來綁定應用程式邏輯和布局。期待在項目中的使用~~
作者:憤怒的五百萬
https://www.jianshu.com/p/1f5a819682c7
閱讀更多
相信自己,沒有做不到的,只有想不到的在這裡獲得的不僅僅是技術!