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