此处显示了一个实现: http://msdn.microsoft.com/en-us/library/w369ty8x.aspx
与仅使用类接口实现此设计模式的经典方法相比,有什么优势?
例如,由于您通过指令在订阅者和发布者之间进行了紧密的直接绑定,因此解耦在哪里:
pub.RaiseCustomEvent += HandleCustomEvent;
因此,在这种情况下,我看不到任何与直接经典实现相关的解耦优势。
答案 0 :(得分:2)
便利性是一个很大的问题,特别是因为C#没有Java的内部类;因为它将是一个单方法接口,这允许简单的订阅 - 可能通过类型的方法,但甚至可能内联:
pub.RaiseCustomEvent += delegate { DoSomething(); };
上面也允许对任何变量等进行完全词汇捕获(与Java相比,它捕获任何变量的值 - 而不是变量本身 - 因此可以进行双向通信)。 / p>
要使用接口执行此操作,我需要声明一个新类,实现接口,提供一个方法来提供实现,并处理任何变量/捕获传输。
事件也允许以非常方便的方式向多个订阅者广播。
代表在运行时(对于元编程等)也比在类中更容易创建 - 例如,我可以在运行时创建委托(从头开始)并使用DynamicMethod
非常轻松地订阅它(如果我喜欢IL)或Expression
(如果我喜欢AST)。创建一个类型并实现一个接口需要更多的工作(AssemblyName
,AssemblyBuilder
,ModuleBuilder
,TypeBuilder
和至少2 Type
s和{{ 1}} S)。
答案 1 :(得分:2)
再次,方便:
使用接口,您必须:
对于事件,一切都在一行中完成,.NET自动处理一个事件的多个钩子。