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 }

浅谈MVP的更多相关文章

  1. 浅谈 MVP in Android(转)

    我自己写的demo:https://pan.baidu.com/s/1dFImVYD 一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让 ...

  2. 浅谈 MVP in Android

    一.概述 对于MVP(Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,“让Model和View完全解耦”等等.本篇博文仅是为了做下记录,提出一些自己的看法,和帮 ...

  3. 浅谈MVP架构及开发模式

    Model-View-Presenter(MVP)概述    MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一度成 ...

  4. 浅谈MVP设计模式

    最近公司在做一个医疗项目,使用WinForm界面作为客户端交互界面.在整个客户端解决方案中.使用了MVP模式实现.由于之前没有接触过该设计模式,所以在项目完成到某个阶段时,将使用MVP的体会写在博客里 ...

  5. 浅谈MVC、MVP、MVVM

    MVC M: Model            模型——数据            (对于前台而言例如:ajax.jsonp等从后台获取数据的) V:  View             视图——表现 ...

  6. 浅谈MVVM模式和MVP模式——Vue.js向

    浅谈MVVM模式和MVP模式--Vue.js向 传统前端开发的MVP模式 MVP开发模式的理解过程 首先代码分为三层: model层(数据层), presenter层(控制层/业务逻辑相关) view ...

  7. [原创]浅谈在创业公司对MVP的理解

    [原创]浅谈在创业公司对MVP的理解 目前自已所处的公司类似一个创业平台,我们内部会不断的去孵化不同方向的产品,产品经理经常谈到的一个词就是MVP,所以有必需要去了解下什么是MVP? 1 什么是MVP ...

  8. Android开发-浅谈架构(二)

    写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...

  9. [原创]浅谈在创业公司对PMF的理解

    [原创]浅谈在创业公司对PMF的理解 在创业时,大多数人都常谈一个词叫"MVP“,但PMF谈的比较少,PMF在创业公司尤为重要,以下谈谈个人一些看法. 1.什么是PMF? 创业公司:一种是找 ...

随机推荐

  1. GAN训练技巧汇总

    GAN自推出以来就以训练困难著称,因为它的训练过程并不是寻找损失函数的最小值,而是寻找生成器和判别器之间的纳什均衡.前者可以直接通过梯度下降来完成,而后者除此之外,还需要其它的训练技巧. 下面对历年关 ...

  2. 最全总结 | 聊聊 Python 数据处理全家桶(配置篇)

    1.前言 在实际项目中,经常会接触到各种各样的配置文件,它可以增强项目的可维护性 常用配件文件的处理方式,包含:JSON.ini / config.YAML.XML 等 本篇文章,我们将聊聊 Pyth ...

  3. plt.imshow()显示图片色差问题

    转载:https://www.cnblogs.com/darkknightzh/p/6039667.html 由于系统缺少某些库,导致cv2.imshow()无法使用,于是使用matplotlib.p ...

  4. GetDlgItem(函数详解)

    转载: https://blog.csdn.net/hk121/article/details/80942850 hwndScroll = GetDlgItem(hwnd, IDC_SCROLL); ...

  5. python 给IDLE添加行号

    [LineNumbers] enable=1 enable_editor=1 enable_shell=1 visible=1 [LineNumbers_cfgBindings] linenumber ...

  6. excel——VlookUp函数的使用

    VlookUp函数,查询两个表中的相同字段数据,并将需要引用的数据从B表填充到A表 1.打开A表,将需要查询的列选中 在需要引用的列输入 = 在上方,函数选择中选择VLOOKUP函数 Windows: ...

  7. 工信部今日向三大运营商和中国广电发放5G商用牌照

    央视快讯:工信部向中国电信.中国移动.中国联通.中国广电发放5G商用牌照. 2016年5月5日,工信部向中国广播电视网络有限公司颁发了<基础电信业务经营许可证>,批准中国广播电视网络有限公 ...

  8. Apple uses Multipath TCP

    http://blog.multipath-tcp.org/blog/html/2018/12/15/apple_and_multipath_tcp.html December 15, 2018 Ap ...

  9. docker启动镜像报错

    docker启动镜像报错: docker: Error response from daemon: driver failed programming external connectivity on ...

  10. Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?

    本文出自"Python为什么"系列,请查看全部文章 在日常使用 Python 时,我们经常需要创建一个列表,相信大家都很熟练了吧? # 方法一:使用成对的方括号语法 list_a ...