EventHandlers或Delegates
我在一些使用被动视图的WinForms应用程序中实现了MVP模式。 我实现了一个包含Action <T>和Func <T>形式的属性和委托的接口,以在具体视图中连接UI事件并回叫主讲者。
我即将开始一个新项目,并对在线模式进行了一些研究,包括模式的许多示例,并注意到所有人都使用EventHandler来通知演示者。
我不明白为什么会在这种情况下使用事件,因为我认为只有一个主持人的观点。
我的问题是,这是为了与.Net框架如何使用事件保持一致,或者是因为我没有看到的其他原因?
这是我使用的模式的一个简单例子:
public interface IViewAbstraction
{
public ModelData ModelData { set; }
public Action<ModelData> ModelDataChangedCallback { set; }
}
public class SomeWinForm : Form, IViewAbstraction
{
private Action<ModelData> modelDataChanged;
private ModelData model;
public ModelData ModelData
{
set { /* when this property changes, update UI */ }
}
public Action<ModelData> ModelDataChangedCallback
{
set { modelDataChanged = value; }
}
private void OnSomeWinformsEvent(EventArgs args)
{
if (modelDataChanged == null) throw new Exception();
modelDataChanged(model);
}
}
public class Presenter
{
private readonly IViewAbstraction view;
private readonly IDataLayerAbstraction dataLayer;
public Presenter(IViewAbstraction view, IDataLayerAbstraction dataLayer)
{
this.dataLayer = dataLayer;
this.view = view;
this.view.ModelDataChangedCallback = OnModelChanged;
this.view.ModelData = dataLayer.GetData();
}
private void OnModelChanged(ModelData data)
{
// validate and save data.
}
}
您的模式与使用事件基本相同,主要区别在于。 事件不公开底层代理(在你的例子中是ModelDataChangedCallback)。 暴露这是不好的做法,因为其他代码可以清除调用列表。 一个事件会有一个潜在的委托,可以添加或删除,但从来没有从班级范围外清除。
我不明白你没有多个订阅者的观点 - 这不是不使用事件的理由。 事件只是让班级说“嗨!这件事已经发生”的一种方式,与Presenter对象进行1对1映射是完全合理和正常的。
您也不会在视图中看到奇怪的只写属性。
链接地址: http://www.djcxy.com/p/59117.html