谁应该负责将观察者添加到事件中

问题描述 投票:0回答:1

我需要链接三个类,Portal、WaveManager 和 TimeManager,以便当 Portal 中满足条件时,执行 TimeManager.SlowTime() 和 WaveManager.SpeedUpSpawn() 。在我看来,事件是最明显的设计解决方案,但我总是怀疑谁应该负责添加观察者。这是我可以想象的两个选择:

A. TimeManager 和 WaveManager 将自己添加为 Portal 中事件的观察者:

B.观察者添加是由某个中间类的实例进行的:

Portal 是应用程序中的一个次要外围类,WaveManager 与 TimeManager 相比也是如此。尽管没有从很多地方调用它,但像我在选项 A 中所做的那样,强制 TimeManager 了解像 Portal 这样的次要类,只是为了能够将自身添加为事件的侦听器,这感觉是错误的。

另一方面,选项 B 似乎太复杂了,而且我的代码中的哪个类应该负责这些添加并不明显。我可能需要为此目的添加临时类和功能。

添加观察员的方式一般是怎样的?让观察员将自己添加为观察员是常见的做法还是良好的做法?除了我建议的两种之外还有其他设计选择吗?

design-patterns observer-pattern
1个回答
0
投票

我相信

Portal
在这里是一个主题。 所以看起来
Portal
应该添加/注册新的观察者。

让我展示一些通过 C# 实现观察者模式的示例:

这些是与观察者相关的类:

public interface IMyObserver
{
    public void Update(string myMessage);
}

及其具体实现:

public class MyObserver : IMyObserver
{
    private MySubject _mySubject;
    private string _myMessage;

    public MyObserver(MySubject mySubject)
    {
        _mySubject = mySubject;
        _mySubject.RegisterObserver(this);
    }

    public void Update(string myMessage)
    {
        _myMessage = myMessage;
        Console.WriteLine($"Observer have seen this message: {_myMessage}");
    }
}

这些是与主题相关的课程:

public interface IMySubject
{
    public void RegisterObserver(IMyObserver o);

    public void RemoveObserver(IMyObserver o);

    public void NotifyObservers();
}

及其具体实现:

public class MySubject : IMySubject
{
    private List<IMyObserver> _observers;
    private string _myMessage;

    public MySubject() =>
        _observers = new List<IMyObserver>();

    public void NotifyObservers()
    {
        foreach (IMyObserver observer in _observers)
            observer.Update(_myMessage);
    }

    public void RegisterObserver(IMyObserver o) => _observers.Add(o);

    public void RemoveObserver(IMyObserver o) => _observers.Remove(o);

    public void MyMessageChanged() => NotifyObservers();

    public void SetMessage(string message)
    {
        _myMessage = message;
        MyMessageChanged();
    }
}

然后你可以像这样调用上面的代码:

MySubject mySubject = new ();
MyObserver myObserver = new (mySubject);

// message from subject
mySubject.SetMessage("Hello World!");

输出:

© www.soinside.com 2019 - 2024. All rights reserved.