简述:
看到大家评论的这么多,我目的达到。我放上去的代码,其实是有点值得疑义之处,所以我在标题后加[讨论版]的字样。拿上篇文章中"saucer"评论,他说的没错。其实Model View Presenter也是不固定的,web Client Software Factory使用的就是Mode View Presenter + Controller模式(MVPC模式),当然代码改进是必须的,此篇所表现的Demo,是一个MVP+C模式简易实现,不过因为没有加入Ioc,所以还是有值大家添砖加瓦的地方。ok.
观点认同方面:见贴子底部
代码部分:
首先,先写一段伪代码:
public interface IView
{
}
public class Presenter
{
IView view;
Controller controller;
}
public partial class TestPage: Page, IView
{
Presenter presenter;
}
public class Controller
{
Data data;
}
public class Data
{
}
那为什么要加上Controller呢?
一句话:加上Controller可以让多个Presenter 共享DataModel
那Controller 类中可以包括数据的缓冲,获取和数据的更新etc,其实Controller这时变成一个相对独立的控制器,当然也可以把Controller用作状态控制器
比如:一个Presenter向Controller发送Next(调用Next方法)
Controller根据当前的状态导航到相应的页面,他就可以通过调用一个导航服务对象来导航,Controller本身并不处理导航,Clear。其实学习完Web Client SofteWare Factory基本就明白了。
PresenterLayer:
{
public interface IDataView
{
Int32 DataId { get; }
String Title { set; }
String Text { set; }
}
}
namespace MVPDesign.Presenter
{
using MVPDesign.Control;
public class DataPresenter
{
IDataView view;
public DataPresenter(IDataView view)
{
this.view = view;
}
public void RetrieveData()
{
Controller controller = new Controller(view.DataId);
view.Title = controller.Title;
view.Text = controller.Text;
}
}
}
ViewLayer:
{
using MVPDesign.Presenter;
public partial class TestPage : Page, IDataView
{
DataPresenter dataPresenter;
protected void Page_Load(object sender, EventArgs e)
{
dataPresenter = new DataPresenter(this);
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
dataPresenter.RetrieveData();
}
Int32 IDataView.DataId
{
get { return Convert.ToInt32(this.DDL.SelectedValue); }
}
String IDataView.Title
{
set { this.lblTitle.Text = value; }
}
String IDataView.Text
{
set { this.lblText.Text = value; }
}
}
}
ModelLayer: 代码同前篇文章
XML源:同前篇文章
Controller:
{
using MVPDesign.ModelLayer;
public class Controller
{
private int id;
public Controller(int ID)
{
id = ID;
}
private XmlData GetXmlData()
{
return XmlData.GetDataById<XmlData, Int32>(id);
}
public String Title
{
get { return GetXmlData().Title; }
}
public String Text
{
get { return GetXmlData().Text; }
}
}
}
讨论处[有关于观点认同方面]:
“我觉得MVP模式完是理化的方法, 在实际工作上完全不可能用, 试想asp.net的控件和winform的控件差别还是很大的,不可能完全一致 ” 评论者:dali
@dali
非常同意你的观点,只要界面稍微复杂点,用起mvp来是恼火的.况且lz说的好像也不是真正的mvp,mvp提倡所有的view要实现Iview,而将具体的界面调用委托给展示层,外表上非常的解偶,也就是说以前你winform写的程序,可以很好的转移到webform中,由于展示层和view中的控件已经实现解偶,所以winform和webform中控件的不一致对它的影响非常小,更由于它推荐的是事件委托,所以解偶还算比较彻底.但是,还是那句话,要是界面很复杂呢,比如充斥大量用户自定义控件和服务控件,这时开发起来就比较麻烦,效率会很低.
评论者:hehehe
针对以上所评:首先,我是不怎么同意的;其次,询问经常使用此模式的一些人
凌说:以上有一点可能不准确,wpf应该在web和winform都是使用一套控件
niwalker言:以上说法是错误的;不说别的,在我的项目中就已经用过多次mvp和mvpc模式了
嗯,欢迎大家侃侃