设计问题:假设我们有父对象和子对象。有时,子对象说“父母,您必须更新状态”。因此,
和
当然,除了必须撤消孩子的情况以外,除了使用此callBack函数外,任何机会都可以影响父对象。
答案 0 :(得分:1)
对于观察者模式来说,这似乎是一个很好的例子,特别是如果孩子确实不需要父级的任何状态信息时。而且,如果父母想忽略孩子(不幸的是经常发生),您只需取消订阅该事件即可。
class Parent
{
public Parent(Child child)
{
Child = child;
Child.UpdateYourStatus += ComputeNewStateAndOutput;
}
Child Child {get; set;}
private void ComputeNewStateAndOutput(sender, e) { ... }
public void DisownChild()
{
//You are no longer my son (sigh, heard that one before)
Child.UpdateYourStatus -= ComputeNewStateAndOutput;
}
}
class Child
{
public event EventHandler UpdateYourStatus;
}
答案 1 :(得分:-1)
您的两个选择在下面基本上是相同的,因此您可以随意选择自己喜欢的语法糖口味。在这两种情况下,都有某种类型的回调函数签名(在第一种情况下为类或接口,在第二种情况下为委托类型)和对象引用(在第一种情况下显式传递,或在委托实例中绑定)在第二种情况下。)
Microsoft确实对何时选择一个准则有一些指导:https://msdn.microsoft.com/library/2e759bdf-7ca4-4005-8597-af92edf6d8f0
通过回调选择对象引用/接口的一个很好的理由是,您知道您肯定会在父对象上调用多个回调。传递一个引用来实现定义所有这些回调的接口是有意义的,而不是必须创建一堆委托实例并将它们全部一起传递。
相反,如果您知道要为单个对象提供多种不同的回调实现,例如。因为您希望以完全不同的方式响应由不同子级调用的回调,所以使用函数指针/代理可能更有意义,但是无论哪种情况,您都不会强制选择一个选项在另一个之上。