当前位置: 首页 > news >正文

MVP简单demo

 "接口:ITestMvpView""窗体:FrmTestMvp"," Presenter TestMvpPresenter"

先看ITestMvpView代码: 

namespace TEST_MVP

{

    //声明委托

    public delegate void Button1_Click();

    interface ITestMvpView

    {

        //声明控件

        TextBox TextBox1{get;}

        //事件

        event Button1_Click Click;

    }

}

 

窗体代码:

 

namespace TEST_MVP

{

    public partial class FrmTestMvp : Form, ITestMvpView

    {

        private TestMvpPresenter _testMvpPresenter;

        public FrmTestMvp()

        {

            InitializeComponent();

            //注意构造Presenter时需把自身传过去

            this._testMvpPresenter = new TestMvpPresenter(this);

        }

        //单击按钮事件

        private void button1_Click(object sender, EventArgs e)

        {

            if (Click != null)

            {

                Click();

            }

        }

        #region ITestMvpView 成员

        //实现接口属性方法

        public TextBox TextBox1

        {

            get { return this.textBox1; }

        }

        //委托事件

        public new event Button1_Click Click;

     

        #endregion

    }

}

 

Presenter 代码:

 

namespace TEST_MVP

{

 

    class TestMvpPresenter

    {

        private ITestMvpView _testMvpView;

       // 构造函数,传入视图接口

            public TestMvpPresenter(ITestMvpView testMvpView)

        {

            this._testMvpView = testMvpView;

            this.InitEvent();

        }

        //加载委托事件

        private void InitEvent()

        {

            this._testMvpView.Click += new Button1_Click(_testMvpView_Click);

        }

        //处理事件

        void _testMvpView_Click()

        {

            if (CheckValue())

            {

                this.ShowMessage(this._testMvpView.TextBox1.Text);

            }

            else

            {

                this.ShowMessage("输入的值不能为空!");

                this._testMvpView.TextBox1.Focus();

            }          

        }

        //检查TestBox1的输入值是否合法

        private bool CheckValue()

        {

            if (this._testMvpView.TextBox1.Text.ToString() == "")

            {

                return false;

            }

            return true;

        }

        private void ShowMessage(string message)

        {

            MessageBox.Show(message);

        }

    }

        由上面的代码我们可以看出其实接口里声明的事件和控件都是要在Presenter里要处理窗体中的信息,TextBox控件如此、委托事件也是如此,他们都是要在P中处理的。重要的是窗体必须实现IView接口并且必须New 一个P,把自身作为参数传到P里,这样在P里就可以利用多态访问窗体的成员了。并且重点是在窗体里我们可以利用委托或其他技术,把对用户输入输出、事件的响应,全部放到P里处理。因为P不知道窗体,只知道IView,所以我们可以建立多个不同的窗体来对应一个P了,只要他们的业务逻辑、事件处理相同即可,换句话说即P并不知道窗体是windwosForm的还是webForm的,他只知道IViw接口,只要是实现了IView接口的窗体就行。

所以如果能够很好的利用MVP来编程,则窗体将变得非常简单 , 甚至可以让毫无经验的编码人员来负责窗体的UI设计等,真的是很方便,另外对将来的有WebFormWindowsForm的互相转换打下良好的技术基础,甚至你可以两套东西并行开发,采用MVP模式会使这变得极为简单。

 

相关文章:

  • ListView,CheckedListBox 绑定技术
  • 文件操作,涉及CFileFind ,CFileDialog CFile 类的操作。
  • 不同线程操作控件
  • c#关键字,ref和out
  • PowerDesigner 15 反向生成PDM
  • 限制线程的执行个数
  • 线程服务的停止与启动
  • 生产者,消费者线程
  • 单实例运行程序
  • play framework系列之maven 构建
  • python tcp 实时抓包
  • 个人支付平台
  • Android 程序分析环境搭建-开发环境搭建
  • 分析Android APK-反编译修改打包
  • Android 程序分析环境搭建-静态分析环境搭建
  • Linux中的硬链接与软链接
  • mongodb--安装和初步使用教程
  • Node 版本管理
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring Boot MyBatis配置多种数据库
  • Travix是如何部署应用程序到Kubernetes上的
  • 七牛云假注销小指南
  • 三分钟教你同步 Visual Studio Code 设置
  • 栈实现走出迷宫(C++)
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​Spring Boot 分片上传文件
  • ​你们这样子,耽误我的工作进度怎么办?
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $().each和$.each的区别
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (三)elasticsearch 源码之启动流程分析
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .apk文件,IIS不支持下载解决
  • .md即markdown文件的基本常用编写语法
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net framework4与其client profile版本的区别
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net中生成excel后调整宽度
  • @AliasFor注解
  • @Autowired自动装配
  • @Resource和@Autowired的区别
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [C#] 如何调用Python脚本程序
  • [c]扫雷
  • [CF407E]k-d-sequence
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [IMX6DL] CPU频率调节模式以及降频方法
  • [iOS开发]事件处理与响应者链
  • [LeetCode]Max Points on a Line
  • [MFC] VS2013版本MFC工程移植到VC6.0上
  • [Python基础]Python文件处理小结
  • [SpringBoot系列]进阶配置