它使用C#事件系统实现Publisher / Subscriber模式而不是使用类接口实现它有什么优势?

时间:2011-02-06 10:33:07

标签: c# .net frameworks

此处显示了一个实现: http://msdn.microsoft.com/en-us/library/w369ty8x.aspx

与仅使用类接口实现此设计模式的经典方法相比,有什么优势?

例如,由于您通过指令在订阅者和发布者之间进行了紧密的直接绑定,因此解耦在哪里:

pub.RaiseCustomEvent += HandleCustomEvent;

因此,在这种情况下,我看不到任何与直接经典实现相关的解耦优势。

2 个答案:

答案 0 :(得分:2)

便利性是一个很大的问题,特别是因为C#没有Java的内部类;因为它将是一个单方法接口,这允许简单的订阅 - 可能通过类型的方法,但甚至可能内联:

pub.RaiseCustomEvent += delegate { DoSomething(); };

上面也允许对任何变量等进行完全词汇捕获(与Java相比,它捕获任何变量的 - 而不是变量本身 - 因此可以进行双向通信)。 / p>

要使用接口执行此操作,我需要声明一个新类,实现接口,提供一个方法来提供实现,并处理任何变量/捕获传输。

事件允许以非常方便的方式向多个订阅者广播。

代表在运行时(对于元编程等)也比在类中更容易创建 - 例如,我可以在运行时创建委托(从头开始)并使用DynamicMethod非常轻松地订阅它(如果我喜欢IL)或Expression(如果我喜欢AST)。创建一个类型并实现一个接口需要更多的工作(AssemblyNameAssemblyBuilderModuleBuilderTypeBuilder和至少2 Type s和{{ 1}} S)。

答案 1 :(得分:2)

再次,方便:

使用接口,您必须:

  • 派生自界面
  • 实施回调(所有这些!),即使您不需要某些活动
  • 注册

对于事件,一切都在一行中完成,.NET自动处理一个事件的多个钩子。