浅谈MVP

MVP是什么

MVP:Model-View-Presenter
Model:表示数据提供者;View:表示数据展示;Presenter:是M与V沟通的桥梁。

MVP工作方式

 

UI:告知Presenter需要怎样的数据(调用方法)
Presenter:调用对应的业务方法获取数据(调用业务方法),并主动通知UI(调用UI接口方法,或者触发UI事件)
使UI与数据业务数据层解耦
将UI抽象成接口,面向接口实现

代码示例

1、定义View的接口:

 1 public delegate void BindDataHandler(object sender, List<string> data);
 2     /// <summary>
 3     /// 
 4     /// </summary>
 5     public interface IMainView
 6     {
 7         /// <summary>
 8         /// 绑定数据事件
 9         /// </summary>
10         BindDataHandler BindDataEvent { get; }  //声明事件,此由Presenter触发,可以用于UI中事件传递。例如用户控件中的传递
11         /// <summary>
12         /// 通知更新结果
13         /// </summary>
14         /// <param name="flag"></param>
15         /// <param name="message"></param>
16         void NotifyUpdateResult(bool flag, string message);
17     }
View Code

2、定义对应View的Presenter

 1 /// <summary>
 2     /// MainView Presenter
 3     /// </summary>
 4     public class MainPresenter
 5     {
 6         /// <summary>
 7         /// 
 8         /// </summary>
 9         public IMainView MainView { get; set; }
10         /// <summary>
11         /// 
12         /// </summary>
13         /// <returns></returns>
14         public void Query()
15         {
16             //TODO调用业务层去查询数据
17             List<string> strList = new List<string>()
18             {
19                 "a","b","c"
20             };
21             if (MainView.BindDataEvent != null)
22             {
23                 MainView.BindDataEvent(null, strList);
24             }
25         }
26     }
View Code

3、定义View基类

 1     /// <summary>
 2     /// BaseView
 3     /// </summary>
 4     /// <typeparam name="T"></typeparam>
 5     public class BaseView<T> :Form where T : class,new()
 6     {
 7         public T presenter;
 8         /// <summary>
 9         /// 
10         /// </summary>
11         public BaseView()
12         {
13             Type type = typeof(T);
14             presenter = Activator.CreateInstance(type) as T; 
15         }
16         /// <summary>
17         /// 
18         /// </summary>
19         public T Presenter
20         {
21             get { return presenter; }
22         } 
23     }
View Code

4、定义实际的View

 1  public partial class FrmMainView : BaseView<MainPresenter>, IMainView
 2     {
 3         public FrmMainView()
 4         {
 5             InitializeComponent();
 6             presenter.MainView = this;
 7             this.bindDataEvent += Presenter_BildDataHander;
 8         }
 9 
10         void Presenter_BildDataHander(object sender, List<string> data)
11         {
12             //TODO绑定数据(此处仅是示例,其实应该用方法不用事件)
13             this.dgvData.DataSource = data;
14         }
15 
16         private void tsbQuery_Click(object sender, EventArgs e)
17         {
18             //TODO构造查询条件,调用方法查询
19             this.Presenter.Query();
20         }
21 
22         private BindDataHandler bindDataEvent;
23         public BindDataHandler BindDataEvent
24         {
25             get
26             {
27                 return bindDataEvent;
28             }
29         }
30         /// <summary>
31         /// 
32         /// </summary>
33         /// <param name="flag"></param>
34         /// <param name="message"></param>
35         public void NotifyUpdateResult(bool flag,string message)
36         {
37             if (flag)
38             {
39                 MessageBox.Show("更新成功");
40             }
41             else
42             {
43                 MessageBox.Show("更新失败  "+message);
44             }
45         }
46     }
View Code

 

posted on 2018-04-11 14:55  john_yong  阅读(114)  评论(0编辑  收藏  举报

导航