MVP初探

时间:2023-03-09 16:19:55
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操控。

但不能将控件直接以属性的形式暴露出来:

 public interface IView
{
  TextBox TextBoxUserName{set;}
}

这样使得在无形当中将Presenter和View技术平台绑定了。

 public interface IView
{
string DisplayInfo{set;}
}
public partial class View:BaseView,IView
{
public string DisplayInfo
{
   set
    {
     this.TextBoxUserName.Text = value;  
    }
}
}

通过接口和实现接口的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的属性获取;