我需要链接三个类,Portal、WaveManager 和 TimeManager,以便当 Portal 中满足条件时,执行 TimeManager.SlowTime() 和 WaveManager.SpeedUpSpawn() 。在我看来,事件是最明显的设计解决方案,但我总是怀疑谁应该负责添加观察者。这是我可以想象的两个选择:
A. TimeManager 和 WaveManager 将自己添加为 Portal 中事件的观察者:
B.观察者添加是由某个中间类的实例进行的:
Portal 是应用程序中的一个次要外围类,WaveManager 与 TimeManager 相比也是如此。尽管没有从很多地方调用它,但像我在选项 A 中所做的那样,强制 TimeManager 了解像 Portal 这样的次要类,只是为了能够将自身添加为事件的侦听器,这感觉是错误的。
另一方面,选项 B 似乎太复杂了,而且我的代码中的哪个类应该负责这些添加并不明显。我可能需要为此目的添加临时类和功能。
添加观察员的方式一般是怎样的?让观察员将自己添加为观察员是常见的做法还是良好的做法?除了我建议的两种之外还有其他设计选择吗?
我相信
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!");
输出: