從這幅圖可以看到,我們可以看到在MVC里,View是可以直接訪問Model的!從而,View里會包含Model信息,不可避免的還要包括一些業務邏輯。
在MVC模型里,更關注的Model的不變,而同時有多個對Model的不同顯示,及View。
所以,在MVC模型里,Model不依賴於View,但是View是依賴於Model的。不僅如此,因為有一些業務邏輯在View里實現了,導致要更改View也是比較困難的,至少那些業務邏輯是無法重用的。
Visual Studio等快速開發工具,讓我們很難把View和Controller分開,我們總是直接在View的事件響應函數里完成了Controller的代碼。而在ASP.NET和XAML里,使用了一種叫做Code-Behind的技術,可以把View和Controller進行分離。這樣,View就可以完全由UI設計工程師來完成,而Controller由程序員來完成,兩者可以直接合成不需要像現在一樣再由程序員做很多的工作。
把Controller和View混在一起,有什么問題?
1.難以測試。
必須手動點擊,使用各種自動化的測試工具。
2.代碼難以重用。
UI是很難重用,因為要求總是不同。所以,導致重復的代碼四處都是,維護麻煩。
MVP
View :是指顯示數據並且和用戶交互的層。在安卓中,它們可以是一個Activity,一個Fragment,一個android.view.View或者是一個Dialog。
Model :是數據源層。比如數據庫接口或者遠程服務器的api。
Presenter:是從Model中獲取數據並提供給View的層,Presenter還負責處理后台任務
MVP是一個將后台任務和activities/views/fragment分離的方法,讓它們獨立於絕大多數跟生命周期相關的事件。這樣應用就會變得更簡單,整個應用的穩定性提高10倍以上,代碼也變得更短,可維護性增強,程序員也不會過勞死了~~
一個暴露接口,一個實現接口,流水式的設計,單向
在MVP里,Presenter完全把Model和View進行了分離,主要的程序邏輯在 Presenter里實現。而且,Presenter與具體的View是沒有直接關聯的,而是通過定義好的接口進行交互,從而使得在變更View時候可以 保持Presenter的不變,即重用!
不僅如此,我們還可以編寫測試用的View,模擬用戶的各種操作,從而實現對Presenter的測試--而不需要使用自動化的測試工具。
我們甚至可以在Model和View都沒有完成時候,就可以通過編寫Mock Object(即實現了Model和View的接口,但沒有具體的內容的)來測試Presenter的邏輯。
在MVP里,應用程序的邏輯主要在Presenter來實現,其中的View是很薄的一層。 因此就有人提出了Presenter First的設計模式,就是根據User Story來首先設計和開發Presenter。在這個過程中,View是很簡單的,能夠把信息顯示清楚就可以了。在后面,根據需要再隨便更改View, 而對Presenter沒有任何的影響了。
如果要實現的UI比較復雜,而且相關的顯示邏輯還跟Model有關系,就可以在View和 Presenter之間放置一個Adapter。由這個 Adapter來訪問Model和View,避免兩者之間的關聯。而同時,因為Adapter實現了View的接口,從而可以保證與Presenter之 間接口的不變。這樣就可以保證View和Presenter之間接口的簡潔,又不失去UI的靈活性。
在MVP模式里,View只應該有簡單的Set/Get的方法,用戶用戶輸入和設置界面顯示的內容,除此就不應該有更多的內容,絕不容許直接直接訪問Model--這就是與MVC很大的不同之處。
1. MVP 就是通過Presenter(主持)把View和Modle分開(最好用接口分開)
方便管理 example:
AppHolder appHolder = new AppHolder();
view.add(appHolder.views);//加載view
appHolder.bind(list);//加載數據
MVVM
他是真正和實現view 和model分離,修改model 不影響view
xml文件里根節點是<layout...
<data>
...
</data>
需要監聽
綁定數據(按文檔)