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模式會使這變得極為簡單。