MVP初探
什么是MVP
MVP是一种UI的架构模式,是MVC的一种变体,适用于基于事件驱动的应用框架。MVP中的M和V分别对应了MVC中的Model和View,而P代替了Controller,而它更多地体现在了Model、view,presenter之间的交互上。
三者的关系:
能够和Model直接进行交互的只有presenter,View只能通过Presenter间接地调用Model。Model是独立的与View无关,与UI处理逻辑Presenter也无关。在实际的操作中M是不存在的;如果可以把M理解为BLL和DAL的合体。
Presenter依赖的是View的一个抽象即IView.
MVP的PV/SC:
PV:Passive View,它是一个被动的View,定义在View中的UI元素控件并不是由V自身控制的,而是被动的交给P来操控。
V中的UI元素通过属性的形式暴露出来,也就是主在定义IView时要定义基于UI元素的属性,使P可以对View操控。
但不能将控件直接以属性的形式暴露出来:
1 public interface IView 2 { 3 TextBox TextBoxUserName{set;} 4 }
这样使得在无形当中将Presenter和View技术平台绑定了。
1 public interface IView 2 { 3 string DisplayInfo{set;} 4 } 5 public partial class View:BaseView,IView 6 { 7 public string DisplayInfo 8 { 9 set 10 { 11 this.TextBoxUserName.Text = value; 12 } 13 } 14 }
通过接口和实现接口的V实现对属性的赋值来实现对相应控件的数据绑定等操作;将对数据的操作留在V中。
PV使得将UI处理逻辑全部定义在Presenter上。对于一些Rich Client来说接口的成员可能会很多,同样的P在控件级别上对V进行了细粒度的控制;这样说增加了P的复杂度,所以也就有了SC模式。
SC:Supervising Controller;将数据的绑定和格式化显示数据等简单的UI处理逻辑转移到V中;P依然是驱动者,V被动的,用户-V-P(-M)-V。
V和P的交互规则(SC):
无论是PV还是SC,M\V\P这三者之间的关系并没有发生改变,V只是前端的客户代理承现展显数据,P是如何处理客户交互行为的决策者。
数据是P主动“推”给V的,而V只向P发送用户通知,都是单向的;所以在IView中被Presenter调用的方法应该都是没有返回值的。可以通过调用IView中的方法,也可以通过事件注册的方式来实现P/V之间的交互。
小结:
MVP只是一个UI架构模式,它体现的是M/V/P三者之间的关系,V只是对P“推”的数据的展现,它并不维护数据的状态,而P则是决策者;
在IView中最好只包含方法,不包含属性,在P所需的V状态在接收到View发送的通知时一次得到,而不是通过View的属性获取;