程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 初探 MVP(Model View Presenter) 設計模式

初探 MVP(Model View Presenter) 設計模式

編輯:.NET實例教程
剛剛轉入C#開發不久,發現了一個類似於Java裡的MVC模式的東東——MVP(Model VIEw Presenter) 模式,個人感覺MVP模式真的和MVC差不多,MVC我這裡就不解釋了,著重講講MVP,MVP 裡的M 其實和MVC裡的M是一個,都是封裝了核心數據、邏輯和功能的計算關系的模型(這裡我們不做重點介紹),而V是視圖(窗體),P我認為就是封裝了窗體中的所有操作、響應用戶的輸入輸出、事件等,個人感覺和MVC裡的C差不多,區別是MVC是系統級架構的,而MVP是用在某個特定頁面上的,也就是說MVP的靈活性要遠遠大於MVC,實現起來也極為簡單。   下面以一個實例來講接,先看源碼:一共三個文件:
                    "接口: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設計等,真的是很方便,另外對將來的有WebForm和WindowsForm的互相轉換打下良好的技術基礎,甚至你可以兩套東西並行開發,

采用MVP模式會使這變得極為簡單。

最後本文中提到的例子可以在csdn中下載到,網址為:
http://download.csdn.Net/source/279995
另外如果對MVP設計模式感興趣的話可以到msnd上搜索,微軟有專門的文章介紹,也歡迎留言和我一起討論。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved