MVP架構(gòu)
什么是MVP
MVP是MVC的變種,其中Model和View的定義與MVC的一致,不同點在于:MVC的Controller是管理一組Model與View之間交互邏輯,是一個管理者;而Presenter(展示者)則是Model于View之間的連接者,針對特定模塊的View提供對應(yīng)的格式化的Model數(shù)據(jù),將View中的行為反饋到Model中。所以MVC中的Controller一般會管理一個或多個Model和一個或多個View,而Presenter則是 M-P-V 一對一,有更細的粒度和更好的解耦。是針對有GUI存在的應(yīng)用程序,目的在于,對于GUI層來說,把UI展示與邏輯分開。
<pre>
- (最主要區(qū)別)View與Model并不直接交互,而是通過與Presenter交互來與Model間接交互。而在MVC中View可以與Model直接交互
- 通常View與Presenter是一對一的,但復雜的View可能綁定多個Presenter來處理邏輯。而Controller是基于行為的,并且可以被多個View共享,Controller可以負責決定顯示哪個View
- Presenter與View的交互是通過接口來進行的,更有利于添加單元測試。
</pre>
MVP結(jié)構(gòu)圖
MVP變種:Passive View
在這種模式下,View和Model之間不能直接交互,View通過Presenter與Model打交道。Presenter接受View的UI請求,完成簡單的UI處理邏輯,并調(diào)用Model進行業(yè)務(wù)處理,并調(diào)用View將相應(yīng)的結(jié)果反映出來。View直接依賴Presenter,但是Presenter間接依賴View,它直接依賴的是View實現(xiàn)的接口。
組成
- (1)View:負責繪制UI元素、與用戶進行交互;
- (2)View interface:需要View實現(xiàn)的接口,View通過View interface與Presenter進行交互,降低耦合,方便進行單元測試;
- (3)Model:負責存儲、檢索、操縱數(shù)據(jù)(有時也實現(xiàn)一個Model interface用來降低耦合),為UI層提供的數(shù)據(jù),或者保存UI層傳下來的數(shù)據(jù);
- (4)Presenter:作為View與Model交互的中間紐帶,處理與用戶交互的負責邏輯;邏輯控制層,從Model處取數(shù)據(jù),運算和轉(zhuǎn)化,最后用View來展示;并處理View傳過來的用戶事件,并做處理。
因此,Presenter 層是連接 Model 層和 View 層的中間層,因此持有 View 層的接口和 Model 層的接口。
<code>
接口的作用類似給層與層之間制定的一種通信協(xié)議,兩個不同的層級相互交流,只要遵守這些協(xié)議即可,并不需要知道具體的實現(xiàn)是怎樣
</code>
規(guī)則
- Model與View不能直接通信,只能通過Presenter
- Presenter類似于中間人的角色進行協(xié)調(diào)和調(diào)度
- Model和View是接口,Presenter持有的是一個Model接口和一個View接口
- Model和View都應(yīng)該是被動的,一切都由Presenter來主導
- Model應(yīng)該把與業(yè)務(wù)邏輯層的交互封裝掉,換句話說Presenter和View不應(yīng)該知道業(yè)務(wù)邏輯層
- View的邏輯應(yīng)該盡可能的簡單,不應(yīng)該有狀態(tài)。當事件發(fā)生時,調(diào)用Presenter來處理,并且不傳參數(shù),Presenter處理時再調(diào)用View的方法來獲取。
MVP優(yōu)點
- 模型與視圖完全分離,我們可以修改視圖而不影響模型;同時,高效的使用模型,所有的交互發(fā)生在 Presenter內(nèi)部
- View和Model抽象成為接口
- 代碼更加容易移植
- 代碼更加容易加入Unit Testing
MVP深入思考
對于 Presenter 的設(shè)計,或者說具體應(yīng)該把哪些內(nèi)容放到 Presenter 中,是一個關(guān)鍵。Model 并不是必須有的;如果帶有 Model,則 Presenter 要實現(xiàn) Model 的回調(diào),在回調(diào)中把數(shù)據(jù)傳給 View 或響應(yīng)。所以 Presenter 必須得有 View 的引用,但可以不用 Model.
參考文章
1.Andriod MVP架構(gòu)
http://toughcoder.net/blog/2015/11/29/understanding-android-mvp-pattern/
2.Google Andriod架構(gòu)藍圖