浅谈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 }
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 }
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 }
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 }