代表与观察者模式

时间:2011-04-07 15:29:48

标签: c# design-patterns

是否有关于何时应该使用委托进行间接关联和观察员的指导原则?

在C#中,您可以使用委托进行简单的回调。我想指向函数的指针和指向成员函数的指针也可以被视为委托(我是对的吗?)。

我意识到使用观察者,你需要创建一个接口,并实现它,因此它的类型更强,关系更正式。对于代理人,只要函数签名和可访问性匹配,就可以“将它们连接起来”。

代表是否使观察者模式没有实际意义?你如何决定代表与观察者模式?

3 个答案:

答案 0 :(得分:8)

观察者模式已经以events的形式为您实现。

事件的优势在于它们可以拥有多个订阅者,而使用委托时,您只能拥有一个。这使事件更好地用于公共接口,以及您没有的情况完全控制谁想要收到有关事情的通知。实际上,事件只是自动管理的代表列表。你必须在你的场景中看到更有意义的东西。

编辑: As commenter Rabbi mentions,上述情况并非完全正确,因为任何代表都可以成为多播代理。事件修饰符的目的是创建一个只能在定义它的类中调用的委托。这对于确保公共接口中的封装非常有用。

答案 1 :(得分:4)

观察者模式的一个优点是,如果您有大量事件通常始终由感兴趣的一方订阅,那么将单个对象传递到方法以订阅事件比订阅每个事件容易得多。个别事件。由于C#缺乏为匿名类as can be done with Java指定接口和方法,实现观察者模式会变得更加费力,所以大多数人都选择使用事件。

传统观察者模式的另一个好处是,在需要因某种原因询问用户的情况下,它可以更好地处理。我遇到了需要通过Web服务边界的对象,其中委托有问题,而观察者模式只是对另一个对象的引用,所以只要序列化保持对象内的引用完整性它就可以正常工作像NetDataContractSerializer那样的图形。在这些情况下,可以根据引用的订阅者是否也在同一个对象图中来区分应该在创建服务边界之前删除的订阅者。

答案 2 :(得分:2)

委托可以用来实现观察者模式 - 想想事件。

如果没有事件,请点击此处查看:http://www.dofactory.com/Patterns/PatternObserver.aspx

如果您愿意,重构使用代理并不需要太多。

我能想到的实现接口的唯一优势是所有实现中的成员名称一致性。