複製鏈接
請複製以下鏈接發送給好友

MVP模式

鎖定
簡稱:MVP 全稱:Model-View-Presenter ;MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數據,View負責顯示。
中文名
MVP模式
外文名
MVP mode
演    變
MVC
方    式
直接Model中讀取數據
邏    輯
Presenter

MVP模式模式簡介

MVP從MVC演變而來,通過表示器將視圖與模型巧妙地分開。在該模式中,視圖通常由表示器初始化,它呈現用户界面(UI)並接受用户所發出命令,但不對用户的輸入作任何邏輯處理,而僅僅是將用户輸入轉發給表示器。通常每一個視圖對應一個表示器,但是也可能一個擁有較複雜業務邏輯的視圖會對應多個表示器,每個表示器完成該視圖的一部分業務處理工作,降低了單個表示器的複雜程度,一個表示器也能被多個有着相同業務需求的視圖複用,增加單個表示器的複用度。表示器包含大多數表示邏輯,用以處理視圖,與模型交互以獲取或更新數據等。模型描述了系統的處理邏輯,模型對於表示器和視圖一無所知。 [1] 
MVP的全稱為Model-View-Presenter,Model提供數據,View負責顯示,Controller/Presenter負責邏輯的處理。MVP與MVC有着一個重大的區別:在MVP中View並不直接使用Model,它們之間的通信是通過Presenter(MVC中的Controller)來進行的,所有的交互都發生在Presenter內部,而在MVC中View會直接從Model中讀取數據而不是通過Controller。 [2] 

MVP模式優勢

MVP模式下表示層的優勢體現在下面三個方面:
1、View與Model完全隔離。
得益於此,Model和View之間具有良好的松耦合設計,這意味着,如果Model或View中的一方發生變化,只要交互接口不變,另一方就沒必要對上述變化做出改變。這使得Model層的業務邏輯具有很好的靈活性和可重用性。
2、Presenter與View的具體實現技術無關。
也就是説,採用諸如Windows表單,WPF,Web表單等用户界面構建技術中的任意一種來實現View層,都無需改變系統的其他部分。甚至為了使B/S,C/S部署架構能夠被同時支持,應用程序可以用同一個Model層適配多種技術構建的View層。
3、可以進行View的模擬測試。
過去,由於View和Model之間的緊耦合,在Model和View同時開發完成之前對其中一方進行測試是不可能的。出於同樣的原因,對View或Model進行單元測試很困難。現在,MVP模式解決了所有的問題。在MVP模式中,View和Model之間沒有直接依賴,開發者能夠藉助模擬對象注入測試兩者中的任一方。 [3] 

MVP模式MVC & MVP

MVP模式 MVP模式
MVP是從經典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數據,View負責顯示。作為一種新的模式,MVP與MVC有着一個重大的區別:在MVP中View並不直接使用Model,它們之間的通信是通過Presenter(MVC中的Controller)來進行的,所有的交互都發生在Presenter內部,而在MVC中View會直接從Model中讀取數據而不是通過Controller。
在MVC裏,View是可以直接訪問Model的。從而,View裏會包含Model信息,不可避免的還要包括一些業務邏輯。在MVC模型裏,更關注的Model的不變,而同時有多個對Model的不同顯示及View。所以,在MVC模型裏,Model不依賴於View,但是View是依賴於Model的。不僅如此,因為有一些業務邏輯在View裏實現了,導致要更改View也是比較困難的,至少那些業務邏輯是無法重用的。 [2] 

MVP模式問題改進方式

在MVP裏,Presenter完全把Model和View進行了分離,主要的程序邏輯在Presenter裏實現。而且,Presenter與具體的View是沒有直接關聯的,而是通過定義好的接口進行交互,從而使得在變更View時候可以保持Presenter的不變,即重用。不僅如此,我們還可以編寫測試用的View,模擬用户的各種操作,從而實現對Presenter的測試--而不需要使用自動化的測試工具。我們甚至可以在Model和View都沒有完成時候,就可以通過編寫MockObject(即實現了Model和View的接口,但沒有具體的內容的)來測試Presenter的邏輯。在MVP裏,應用程序的邏輯主要在Presenter裏實現,其中的View是很薄的一層。因此就有人提出了PresenterFirst的設計模式,就是根據UserStory來首先設計和開發Presenter。在這個過程中,View是很簡單的,能夠把信息顯示清楚就可以了。在後面,根據需要再隨便更改View,而對Presenter沒有任何的影響了。如果要實現的UI比較複雜,而且相關的顯示邏輯還跟Model有關係,就可以在View和Presenter之間放置一個Adapter。由這個Adapter來訪問Model和View,避免兩者之間的關聯。而同時,因為Adapter實現了View的接口,從而可以保證與Presenter之間接口的不變。這樣就可以保證View和Presenter之間接口的簡潔,又不失去UI的靈活性。在MVP模式裏,View只應該有簡單的Set/Get的方法,用户輸入和設置界面顯示的內容,除此就不應該有更多的內容,絕不容許直接訪問Model--這就是與MVC很大的不同之處。

MVP模式優點

MVP與MVC的主要區別是View與Model不直接交互,而是通過與Presenter來完成交互,這樣可以修改視圖而不影響模型,達到解耦的目的,實現了Model和View真正的完全分離。視圖的變化總是比較頻繁,將業務邏輯抽取出來,放在表示器中實現,使模塊職責劃分明顯,層次清晰,一個表示器能複用於多個視圖,而不需要更改表示器的邏輯(當然是在該視圖的改動不影響業務邏輯的前提下),這增加了程序的複用性。數據的處理由模型層完成,隱藏了數據,在數據顯示時,表示器可以對數據進行訪問控制,提高數據的安全性。以前的Android開發是難以進行單元測試的,但是隨着項目變得複雜,測試時保證應用質量的關鍵,MVP模式中,表示器對視圖是通過接口進行的,可以利用測試驅動,模擬出視圖對象,實現視圖相對於表示器的接口,就可以對錶示層進行不依賴於UI環境的單元測試了,這大大降低了Android應用開發中的業務邏輯測試難度和複雜度。MVP模式的引入,視圖層完全不依賴與模型層,相當於將視圖從特定的業務場景中脱離出來,做到了對業務完全不可知的狀態,因此可以將視圖層組件化,提供一系列接口供表示層操作,這樣就可以做出高度可複用的視圖組件了。 [1] 

MVP模式缺點

MVP的明顯缺點是增加了代碼的複雜度,特別是針對小型Android應用的開發,會使程序冗餘。Presenter中除了應用邏輯以外,還有大量的View->Model,Model->View的手動同步邏輯,會導致Presenter臃腫,維護困難。視圖的渲染過程也會放在Presenter中,造成視圖與Presenter交互過於頻繁,如果某特定視圖的渲染很多,就會造成Presenter與該視圖聯繫過於緊密,一旦該視圖需要變更,那麼Presenter也需要變更了,不能如預期的那樣降低耦合度和增加複用性。 [1] 
參考資料
  • 1.    曾露.MVP模式在Android中的應用研究[J].軟件,2016,37(6):75-78.
  • 2.    張正龍,陳永政.淺談MVP設計模式[J].科學諮詢,2014,(28):71-71.
  • 3.    朱滕威.基於Android的開發模式研究[J].環球市場,2018,(15):388.