MVP架構(gòu)
什么是MVP
MVP是MVC的變種,其中Model和View的定義與MVC的一致故黑,不同點(diǎn)在于:MVC的Controller是管理一組Model與View之間交互邏輯呐籽,是一個(gè)管理者袭艺;而Presenter(展示者)則是Model于View之間的連接者滑绒,針對(duì)特定模塊的View提供對(duì)應(yīng)的格式化的Model數(shù)據(jù)权她,將View中的行為反饋到Model中。所以MVC中的Controller一般會(huì)管理一個(gè)或多個(gè)Model和一個(gè)或多個(gè)View刀森,而Presenter則是 M-P-V 一對(duì)一踱启,有更細(xì)的粒度和更好的解耦。是針對(duì)有GUI存在的應(yīng)用程序研底,目的在于埠偿,對(duì)于GUI層來(lái)說(shuō),把UI展示與邏輯分開(kāi)榜晦。
<pre>
- (最主要區(qū)別)View與Model并不直接交互冠蒋,而是通過(guò)與Presenter交互來(lái)與Model間接交互。而在MVC中View可以與Model直接交互
- 通常View與Presenter是一對(duì)一的乾胶,但復(fù)雜的View可能綁定多個(gè)Presenter來(lái)處理邏輯抖剿。而Controller是基于行為的朽寞,并且可以被多個(gè)View共享,Controller可以負(fù)責(zé)決定顯示哪個(gè)View
- Presenter與View的交互是通過(guò)接口來(lái)進(jìn)行的斩郎,更有利于添加單元測(cè)試脑融。
</pre>
MVP結(jié)構(gòu)圖
MVP變種:Passive View
在這種模式下,View和Model之間不能直接交互缩宜,View通過(guò)Presenter與Model打交道肘迎。Presenter接受View的UI請(qǐng)求,完成簡(jiǎn)單的UI處理邏輯锻煌,并調(diào)用Model進(jìn)行業(yè)務(wù)處理妓布,并調(diào)用View將相應(yīng)的結(jié)果反映出來(lái)。View直接依賴(lài)Presenter宋梧,但是Presenter間接依賴(lài)View匣沼,它直接依賴(lài)的是View實(shí)現(xiàn)的接口。
組成
- (1)View:負(fù)責(zé)繪制UI元素乃秀、與用戶(hù)進(jìn)行交互;
- (2)View interface:需要View實(shí)現(xiàn)的接口肛著,View通過(guò)View interface與Presenter進(jìn)行交互,降低耦合跺讯,方便進(jìn)行單元測(cè)試;
- (3)Model:負(fù)責(zé)存儲(chǔ)枢贿、檢索、操縱數(shù)據(jù)(有時(shí)也實(shí)現(xiàn)一個(gè)Model interface用來(lái)降低耦合)刀脏,為UI層提供的數(shù)據(jù)局荚,或者保存UI層傳下來(lái)的數(shù)據(jù);
- (4)Presenter:作為View與Model交互的中間紐帶,處理與用戶(hù)交互的負(fù)責(zé)邏輯愈污;邏輯控制層耀态,從Model處取數(shù)據(jù),運(yùn)算和轉(zhuǎn)化暂雹,最后用View來(lái)展示首装;并處理View傳過(guò)來(lái)的用戶(hù)事件,并做處理杭跪。
因此仙逻,Presenter 層是連接 Model 層和 View 層的中間層,因此持有 View 層的接口和 Model 層的接口涧尿。
<code>
接口的作用類(lèi)似給層與層之間制定的一種通信協(xié)議系奉,兩個(gè)不同的層級(jí)相互交流,只要遵守這些協(xié)議即可姑廉,并不需要知道具體的實(shí)現(xiàn)是怎樣
</code>
規(guī)則
- Model與View不能直接通信缺亮,只能通過(guò)Presenter
- Presenter類(lèi)似于中間人的角色進(jìn)行協(xié)調(diào)和調(diào)度
- Model和View是接口,Presenter持有的是一個(gè)Model接口和一個(gè)View接口
- Model和View都應(yīng)該是被動(dòng)的桥言,一切都由Presenter來(lái)主導(dǎo)
- Model應(yīng)該把與業(yè)務(wù)邏輯層的交互封裝掉萌踱,換句話(huà)說(shuō)Presenter和View不應(yīng)該知道業(yè)務(wù)邏輯層
- View的邏輯應(yīng)該盡可能的簡(jiǎn)單葵礼,不應(yīng)該有狀態(tài)。當(dāng)事件發(fā)生時(shí)并鸵,調(diào)用Presenter來(lái)處理章咧,并且不傳參數(shù),Presenter處理時(shí)再調(diào)用View的方法來(lái)獲取能真。
MVP優(yōu)點(diǎn)
- 模型與視圖完全分離,我們可以修改視圖而不影響模型扰柠;同時(shí)粉铐,高效的使用模型,所有的交互發(fā)生在 Presenter內(nèi)部
- View和Model抽象成為接口
- 代碼更加容易移植
- 代碼更加容易加入U(xiǎn)nit Testing
MVP深入思考
對(duì)于 Presenter 的設(shè)計(jì)卤档,或者說(shuō)具體應(yīng)該把哪些內(nèi)容放到 Presenter 中蝙泼,是一個(gè)關(guān)鍵。Model 并不是必須有的劝枣;如果帶有 Model汤踏,則 Presenter 要實(shí)現(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)藍(lán)圖