MVP模式與MVC模式

MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數據,View負責顯示。作爲一種新的模式,MVP與MVC有着一個重大的區別:在MVP中View並不直接使用Model,它們之間的通信是通過Presenter (MVC中的Controller)來進行的,所有的交互都發生在Presenter內部,而在MVC中View會從直接Model中讀取數據而不是通過 Controller。Alex在他的blog中對於這兩者之間的比較很直觀也比較清楚,原文可以下面的地址找到:http://ameleta.spaces.live.com/blog/cns!5F6316345A821420!163.entry

【譯文】:
Model View Presenter vs Model View Controller


簡介

在我工作中經常需要處理一些由於開發人員沒能很清楚地理解MVC和MVP模式的區別的情況下使用它們而產生的問題。在這篇文章中我將會闡述一下我對兩者之間區別的一些理解。
在N層體系結構中MVC/P模式僅僅只是用於表示層(presentation layer),理解這一點很重要。這兩個模式並不是關於怎麼構建數據層(data layer)和服務層(service layer)的,而是關於怎麼將數據(data)從用戶接口(view)中分離出來,以及用戶接口如何與數據進行交互的。這些模式的使用讓解除你的程序中表示層對對數據和控制邏輯的依賴,從而可以自由的變更表示層。


這兩種模式的一般性概念

1、模型(Model)表示數據模型和業務邏輯(business logic)。模型並不總是DataSet,DataTable之類的東西,它代表着一類組件(components)或類(class),這些組件或類可以向外部提供數據,同時也能從外部獲取數據並將這些數據存儲在某個地方。簡單的理解,可以把模型想象成“外觀類(facade class)”。譯註:這裏的外觀是指“外觀模式”中所說的外觀。外觀的一般作用是爲一個複雜的子系統提供高層次的簡單易用的訪問接口,可以參看下面的圖來理解它的原理:

 

2、視圖(View)將數據層現給用戶。一般的視圖都只是包含用戶界面(UI),而不包含界面邏輯。比如,Asp.net中包含控件的頁面(page)就是一個視圖。視圖可以從模型中讀取數據,但是不能修改或更新模型。
3、層現器(Presenter)/控制器(Controller)包含了根據用戶在視圖中的行爲去更新模型的邏輯。視圖僅僅只是將用戶的行爲告知控制器,而控制器負責從視圖中取得數據然後發送給模型。

MVC/P模式的核心是爲了將模型從視圖/控制器中分離出來,從而使得模型獨立於它們,因此模型不包含對視圖和控制的引用。
什麼是MVC(Model View Presenter)模式?

1、爲了使得視圖接口可以與模型和控制器進行交互,控制器執行一些初始化事件
2、用戶通過視圖(用戶接口)執行一些操作
3、控制器處理用戶行爲(可以用觀察着模式實現)並通知模型進行更新
4、模型引發一些事件,以便將改變發告知視圖
5、視圖處理模型變更的事件,然後顯示新的模型數據
6、用戶接口等待用戶的進一步操作

這一模式的有一下幾個要點:
1、視圖並不使用控制器去更新模型。控制器負責處理從視圖發送過來的用戶操作並通過與模型的交互進行數據的更新
2、控制器可以和視圖融合在一塊。Visual Studion中對Windows Forms的默認處理方式就是這樣的。【譯註:比如我們雙擊一個Button,然後在它的事件裏寫處理邏輯,然後將處理的數據寫回模型中。這裏處理邏輯時間應該是控制器的功能,但是我們並沒有專門寫一個控制器來做這件事情而是接受了VS的默認處理方式,將它寫在Form的代碼中,而這裏的Form在MVC中它就是一個View。所以這說vs默認的處理方式是將把控制器和視圖融合在一起的。】
3、控制器不包含對視圖的渲染邏輯(rendering logic)

“主動—MVC”模式,也是通常意義下的MVC模式

 

 

【譯註:爲什麼說是主動的?View不是等Controller通知它Model更新瞭然後才從Model取數據並更新顯示,而是自己監視Model的更新(如果用觀察者模式)或主動詢問Model是否更新。前面那種等待Controller通知的方式是下面所介紹的“被動—MVC”的實現方式。】

“被動—MVC”模式
與主動MVC的區別在於:
1、模型對視圖和控制器一無所知,它僅僅是被它們使用
2、控制器使用視圖,並通知它更新數據顯示
3、視圖僅僅是在控制器通知它去模型取數據的時候它才這麼做(視圖並不會訂閱或監視模型的更新)
4、控制器負責處理模型數據的變化
5、控制器可以包含對視圖的渲染邏輯

 

MVP模式

與“被動—MVC模式”很接近,區別在於“視圖並不使用模型”。在MVP模式中視圖和模型是完全分離的,他們通過Presenter進行交互。
Presenter與控制器非常相似,但是它們也有一些的區別:
1、Presenter處理視圖發送過來的用戶操作(在MVC中視圖自己處理了這些操作)
2、它用更新過的數據去更新模型(在被動MVC中控制器只是通知視圖去更新過的模型中去取新的數據,而主動MVC中模型通知視圖去更新顯示,控制器不需要做工作)
3、檢查模型的更新(與被動MVC一樣)
4、(與MVC的主要區別)從模型中取數據然後將它們發送到視圖中
5、(與MVC的主要區別)將所做的更新告知視圖
6、(與MVC的區別)用Presenter渲染視圖

 

 

MVP的優勢

1、模型與視圖完全分離,我們可以修改視圖而不影響模型
2、可以更高效地使用模型,因爲所以的交互都發生在一個地方——Presenter內部
3、我們可以將一個Presener用於多個視圖,而不需要改變Presenter的邏輯。這個特性非常的有用,因爲視圖的變化總是比模型的變化頻繁。
4、如果我們把邏輯放在Presenter中,那麼我們就可以脫離用戶接口來測試這些邏輯(單元測試)。


MVP的問題

由於對視圖的渲染放在了Presenter中,所以視圖和Persenter的交互會過於頻繁。

還有一點你需要明白,如果Presenter過多地渲染了視圖,往往會使得它與特定的視圖的聯繫過於緊密。一旦視圖需要變更,那麼Presenter也需要變更了。比如說,原本用來呈現Html的Presenter現在也需要用於呈現Pdf了,那麼視圖很有可能也需要變更。


附:

http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/MVP.mspx?mfr=true

http://www.codeproject.com/useritems/ModelViewPresenter.asp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章