Ext*_*kun 6 c# design-patterns
关于何时应该使用委托进行间接关联和观察员,是否有任何指导方针?
在C#中,您可以使用委托进行简单的回调.我想指向函数的指针和指向成员函数的指针也可以被视为委托(我是对的吗?).
我意识到使用观察者,你需要创建一个接口,并实现它,因此它更强类型,关系更正式.对于委托,只要函数签名和可访问性匹配,您就可以"挂钩".
代表们是否使观察者模式没有实际意义?你如何决定代表与观察者模式?
观察者模式已经以事件的形式为您实现.
事件的优势在于它们可以拥有多个订阅者,而使用委托时,您只能拥有一个订阅者.这使事件更好地适用于公共接口,以及您无法完全控制谁想要通知事情发生的情况.实际上,事件只是自动管理的代表列表.您必须在您的场景中看到更有意义的内容.
编辑: 正如拉比提到的评论者所说,上述情况并非完全正确,因为任何代表都可以成为多播代表.事件修饰符的目的是创建一个只能在定义它的类中调用的委托.这对于确保公共接口中的封装非常有用.
观察者模式的优点之一是,如果您有大量通常总是由相关方订阅的事件,那么将单个对象传递到订阅事件的方法中比单独订阅每个事件要容易得多。由于 C# 不像Java 那样为匿名类指定接口和方法,因此实现观察者模式变得有点费力,因此大多数人还是选择使用事件。
传统观察者模式的另一个好处是,它可以更好地处理因某种原因需要询问订阅者的情况。我遇到过这种需要,即通过 Web 服务边界的对象,其中委托存在问题,而观察者模式只是对另一个对象的引用,因此只要序列化保持对象内引用的完整性,它就可以正常工作像 NetDataContractSerializer 那样的图表。在这些情况下,可以根据引用的订阅者是否也在同一对象图中来区分在建立服务边界之前应删除的订阅者。