MVP简单demo

来源:互联网 发布:淘宝网官网首页电脑版 编辑:程序博客网 时间:2024/06/11 09:26

 "接口: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模式会使这变得极为简单。

 

原创粉丝点击