1. 程式人生 > >Android MVP與MVC區別?

Android MVP與MVC區別?

1、MVP與MVC的區別

  1. Activity職責不同,Activity在MVP中是View層,在MVC中是Controller層,這是MVC和MVP很主要的一個區別,可以說Android從MVC轉向MVP開發也主要是優化Activity的程式碼,避免Activity的程式碼臃腫龐大。

  2. View層不同,MVC的View層指的是XML佈局檔案或者是用Java自定義的View,MVP的View層是Activity或者Fragment。使用傳統的MVC,其中的View,對應的是各種Layout佈局檔案,但是這些佈局檔案中並不像Web端那樣強大,能做的事情非常有限。MVP的View層Activity在實際專案中,隨著邏輯的複雜度越來越大,Activity臃腫的缺點仍然體現出來了,因為Activity中還是充滿了大量與View層無關的程式碼,比如各種事件的處理派發,就如MVC中的那樣View層和Controller程式碼耦合在一起無法自拔。

  3. 控制層不同,MVC的控制層是Activity,或者是Fragment,Controller對應的是Activity,而Activity中卻又具有操作UI的功能,我們在實際的專案中也會有很多UI操作在這一層,也做了很多View中應該做的事情,當然Controller層Activity中也包含Controller應該做的事情,比如各種事件的派發回撥,而且在一層中我們會根據事件再去呼叫Model層操作資料,所以這種MVC的方式在實際專案中,Activity所在的Controller是非常重的,各層次之間的耦合情況也比較嚴重,不方便單元測試。MVP的控制層是Presenter,裡面沒有很多的實際東西,主要是做Model和View層的互動。

  4. 關係鏈不同,MVP中Model層與View是沒有關係的,彼此不會通訊和操作,Model與View的通訊都是Presenter層來傳達的。但是在MVC中,Model層和View是曾在互動的。比如我們自定義的View控制元件裡面肯定是要使用Model的資料的,View也要根據不同的Model資料做出不同的展現!這點尤其是體現在自定義的View中,自定義View需要設定資料,使用者操作了自定義控制元件需要改變資料,View要操作Model怎麼辦?有人說把Controller傳到自定義的View啊,現實是不可能沒一個自定義View都去持有Controller的引用,其實在MVP中就不會這麼尷尬,介面就可以完成。

  5. 適用範圍不同,在Android中,MVP和MVC都用自己的適用情況,使用MVP可以更好的解耦三大模組,模組之間比較清晰,也很方便使用MVP來元件化架構整體專案。但是MVC也是有用武之地的,在元件化的Module或者中介軟體我們可以使用MVC來做,Module或者中介軟體不會存在很複雜的View層,使用MVC可以更加方便我們實現功能。

  6. 互動方式不同,MVP中通訊互動基本都是通過介面的,MVC中的通訊互動很多時候都是實打實的呼叫物件的方法,簡單粗暴!

  7. 實現方法不同 ,MVC和MVP的Model幾乎一樣的,都是處理資料,只要不在Activity或者Fragment中請求資料,其他的所有控制都放在Activity或者Fragment中,這樣寫就基本是MVC的模式,這樣寫不麻煩,但是很容易把Activity寫出上萬行程式碼。用MVP的時候我們需要寫很多View和Presenter介面來實現模組之間的通訊,會增加很多類。

2. 相同點與不同點

(1)相同點: 
優點: 
1.降低耦合度 
2.模組職責劃分明顯 
3.利於測試驅動開發 
4.程式碼複用 
5.隱藏資料 
6.程式碼靈活性 
缺點: 
額外的程式碼複雜度及學習成本。

(2)不同點: 
MVP模式: 
1.View不直接與Model互動,而是通過與Presenter互動來與Model間接互動 
2.Presenter與View的互動是通過介面來進行的,更有利於新增單元測試 
3.通常View與Presenter是一對一的,但複雜的View可能繫結多個Presenter來處理邏輯,業務相似的時候也可以多同個View共享一個Presenter。 
MVC模式: 
1.View可以與Model直接互動 
2.Controller是基於行為的,並且可以被多個View共享 
3.Controller可以負責決定顯示哪個View