gpt4 book ai didi

C# 观察者模式 : Still tightly connected?

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:39 25 4
gpt4 key购买 nike

好的,所以我在这里被观察者模式困住了,我读过的几乎所有教程都告诉主题类订阅观察者。

但是考虑到封装,这怎么能不紧密耦合呢?他们仍然相互依赖,不是吗?

我的意思是,subject Class必须知道观察者对象才能将他添加到通知对象列表中。

因此创建了一个依赖关系,对吧?

我犯了什么错误?

谢谢!

谢谢大家的回复,

现在我有一些新问题。如果我理解正确的话,处理这个问题的最好方法是使用接口(interface)。所以我会那样做 ;)

但是,为什么总是在谈论委托(delegate)和事件?事件是委托(delegate)的一种形式。那么他们为什么不只是说事件呢?

最佳答案

当你说“知道”时,你是对的,发布者必须知道观察者才能向它发布信息。

但是,它不需要“知道”它是硬编码的:

  • 观察者总是这个特定的类
  • 总会有这些特定的观察员可用

在其基本形式中,事件是发布者/观察者在起作用,因此您可以仅通过事件轻松地做到这一点:

public class Observer
{
}

public class Publisher
{
public event EventHandler SomethingHappened;
}

然后您可以让观察者处理该事件:

public class Observer
{
public Observer(Publisher pub)
{
pub.SomethingHappened += Publisher_SomethingHappened;
}

private void Publisher_SomethingHappened(object sender, EventArgs e)
{
}
}

public class Publisher
{
public event EventHandler SomethingHappened;
}

每当发布者引发此事件时,观察者都会收到通知。意识到 Hook 事件的行为是“告诉”那个类关于观察者的信息,但是发布者没有任何关于发布者的硬编码信息,除了有人在外面听。

另一种方法是使用接口(interface):

public class Observer : IObserver
{
public Observer(Publisher pub)
{
pub.Observers.Add(this);
}

void IObserver.SomethingHappened()
{
}
}

public class Publisher
{
public List<IObserver> Observers { get; private set; }
}

public interface IObserver
{
void SomethingHappened();
}

同样,发布者将“知道”观察者,因为它具有对观察者的引用,但它同样没有关于哪个类或将有多少个实例的硬编码信息。

只是一句警告:上面的代码非常有缺陷,至少你应该确保观察者在你完成后从发布者“脱钩”,否则你将在系统中出现泄漏。如果您不明白我的意思,请发表评论,我将在示例中进行编辑。

关于C# 观察者模式 : Still tightly connected?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3837322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com