MVP()
PV模式將所有的UI處理邏輯全部定義在Presenter上意味著所有的UI處理邏輯都可以被測試所以從可測試性的角度來這是一種不錯的選擇但是它要求將View中可供操作的UI元素定義在對應的接口中對於一些復雜的富客戶端(Rich Client)View來說接口成員將會變得很多這無疑會提升編程所需的代碼量從另一方面來看由於Presenter需要在控件級別對View進行細粒度的控制這無疑會提供Presenter本身的復雜度往往會使原本簡單的邏輯復雜化在這種情況下我們往往采用SC模式
在SC模式下為了降低Presenter的復雜度我們將諸如數據綁定和格式化這樣簡單的UI處理邏輯轉移到View中這些處理邏輯會體現在View實現的接口中盡管View從Presenter中接管了部分UI處理邏輯但是Presenter依然是整個三角關系的驅動者View被動的地位依然沒有改變對於用戶作用在View上的交互操作View本身並不進行響應而是直接將交互請求轉發給Presenter後者在獨立完成相應的處理流程(可能涉及針對Model的調用)之後會驅動View或者創建新的View作為對用戶交互操作的響應
View和Presenter交互的規則(針對SC模式)
View和Presenter之間的交互是整個MVP的核心能否正確地應用MVP模式來架構我們的應用主要取決於能否正確地處理View和Presenter兩者之間的關系在由ModelView和Presenter組成的三角關系中核心不是View而是PresenterPresenter不是View調用Model的中介而是最終決定如何響應用戶交互行為的決策者
打個比方View是Presenter委派到前端的客戶代理而作為客戶的自然就是最終的用戶對於以鼠標/鍵盤操作體現的交互請求應該如何處理作為代理的View並沒有決策權所以它會將請求匯報給委托人PresenterView向Presenter發送用戶交互請求應該采用這樣的口吻我現在將用戶交互請求發送給你你看著辦需要我的時候我會協助你而不應該是這樣我現在處理用戶交互請求了我知道該怎麼辦但是我需要你的支持因為實現業務邏輯的Model只信任你
對於Presenter處理用戶交互請求的流程如果中間環節需要涉及到Model它會直接發起對Model的調用如果需要View的參與(比如需要將Model最新的狀態反應在View上)Presenter會驅動View完成相應的工作
對於綁定到View上的數據不應該是View從Presenter上拉回來的應該是Presenter主動推給View的從消息流(或者消息交換模式)的角度來講不論是View向Presenter完成針對用戶交互請求的通知還是Presenter在進行交互請求處理過程中驅動View完成相應的UI操作都是單向(OneWay)的反應在應用編程接口的定義上就意味著不論是定義在Presenter中被View調用的方法還是定義在IView接口中被Presenter調用的方法最好都沒有返回值如果不采用方法調用的形式我們也可以通過事件注冊的方式實現View和Presenter的交互事件機制體現的消息流無疑是單向的
View本身僅僅實現單純的獨立的UI處理邏輯它處理的數據應該是Presenter實時推送給它的所以View盡可能不維護數據狀態定義在IView的接口最好只包含方法而避免屬性的定義Presenter所需的關於View的狀態應該在接收到View發送的用戶交互請求的時候一次得到而不需要通過View的屬性去獲取
實例演示SC模式的應用(S)
為了讓讀者對MVP模式尤其是該模式下的View和Presenter之間的交互方式有一個深刻的認識我們現在來做一個簡單的實例演示本實例采用上面提及的關於員工查詢的場景並且采用ASPNET Web Forms來建立這個簡單的應用最終呈現出來的效果如圖所示前面我們已經演示了采用PV模式下的IView應該如何定義現在我們來看看SC模式下的IView有何不同
先來看看表示員工信息的數據類型如何定義我們通過具有如下定義的數據類型Employee來表示一個員工簡單起見我們僅僅定義了表示員工基本信息(ID姓名性別出生日期和部門)的個屬性
public class Employee
{
public string Id { get; private set; }
public string Name { get; private set; }
public string Gender { get; private set; }
public DateTime BirthDate { get; private set; }
public string Department { get; private set; }
public Employee(string id string name string gender
DateTime birthDate string department)
{
thisId = id;
thisName = name;
thisGender = gender;
thisBirthDate = birthDate;
thisDepartment = department;
}
}
[] []
From:http://tw.wingwit.com/Article/program/net/201311/16126.html