上一篇得到大家的关注,非常感谢。由于自己对于这些模式的理解也是有限,对于这些模式的比较,是结合自己的理解,一些地方不一定准确,但是只有亮出自己的观点,才能抛砖引玉不是? 欢迎各位拍砖。:)
四. MVP模式
4.1 MVP的思想
4.2 UI界面接口化
4.3 Presenter —— Model和View之间的桥梁
4.4 MVP的代码结构和时序图
4.5 MVP模式总结
五. MVVM模式
5.1 MVVM模式的设计思想
5.2 MVVM模式结构图
六. MVC, MVP和MVVM模式使用场景总结
</div>
四, MVP模式
MVP模式也是一种经典的界面模式。MVP中的M代表Model, V是View, P是Presenter。
下面例子中的完整代码,可以在这里下载: WinformMVP源码
大家还可以比较这篇文章 浅析MVP模式中V-P交互问题及案例分享
4.1 MVP的思想
MVP模式在我看来,是一个真正意义上的隔离View的细节和复杂性的模式。为什么这么说:
因为在其它模式中V都代表的是UI界面, 是一个html页面,XAML文件或者winform界面。但是在MVP模式中的V代表的是一个接口,一个将UI界面提炼而抽象出来的接口。接口意味着任何实现了该接口的界面,都能够复用已有的Presenter和Model代码。
4.2 UI界面接口化
要很好的理解MVP, 就要有把UI界面接口化的能力。看下面的界面中,将红色标记的User Control抽象一下,就能得到下面的接口
![]() |
界面中的2个输入框被抽象成了UserName和UserAge两个属性。Save按钮的点击事件,被抽象成了事件UserAddEvent。winform中实现该接口的代码如下:
public string UserAge
{
set { this.txbAge.Text = value; }
get { return this.txbAge.Text; }
}
public UserAdd()
{
InitializeComponent();
}
private void btnAdd_Click(object sender, EventArgs e)
{
if (UserAddEvent != null) UserAddEvent(this, e);
}
}
</div>
下面拿UserAge属性来解释一下,UI界面接口化的魔力。当后端代码要获取界面上的年龄值,就只需要get属性, 要更新界面显示的时候,就只需要set属性。
这个时候,后端代码对于界面的操作,被抽象成了对于UserAge属性的操作了,也就是和具体的界面显示无关了。
4.3 Presenter —— Model和View之间的桥梁
上文提到的后端代码中,包含了P和M. M和MVC中一样,指的是逻辑代码。P则是Model和View之间的桥梁,负责将对应的Model和View组合到一起。
针对上面的IUserAdd, 对应的Presenter代码是:
//Presenter构造函数中,将view和model作为参数传入
public UserAddPresenter(IUser model, IUserAdd view)
{
_model = model;
_view = view;
WireUpViewEvents();
}
private void WireUpViewEvents()
{
_view.UserAddEvent += _view_UserAdd;
}
//当view的UserAdd事件触发,取得UI中的数据,调用model逻辑处理,添加新用户。
//同时发送User_ADDED消息到系统中(系统中其它UI部分接收消息,比如这里的DataGrid,它接收到User_ADDED之后,会刷新)
private void _view_UserAdd(object sender, EventArgs e)
{
var user = new User
{
Name = _view.UserName,
Age = Convert.ToInt32(_view.UserAge)
};
_model.AddItem(user);
_facade.SendNotification(ApplicationFacade.USER_ADDED);
}
}
</div>
4.4 MVP的代码结构和时序图
这里的MVP中的代码结构图和时序图,能够更好的帮助理解MVP模式
4.5 MVP模式
您可能想查找下面的文章:
- ASP.NET Core发送邮件的方法
- 在ASP.NET Core 中发送邮件的实现方法(必看篇)
- Asp.net core WebApi 使用Swagger生成帮助页实例
- ASP.NET core Web中使用appsettings.json配置文件的方法
- ASP.NET Core部署前期准备 使用Hyper-V安装Ubuntu Server 16.10
- ASP.NET Core应用中与第三方IoC/DI框架的整合
- ASP.NET Core程序发布到Linux生产环境详解
- 详解ASP.NET Core 网站发布到Linux服务器
- ASP.NET Core全面扫盲贴
- 基于ASP.NET Core数据保护生成验证token示例