按照通常的观察者模式,我有一个观察者和一个主题。
但是我还需要通知Subject观察者发生的事件。
我试图实现的是一个由事件通知的解耦双向决策机制。
观察者和对象都连接到更大的系统。
目前,我正在使用主题向观察者发送事件,并以其他方式标记。
我应该设置一个反观察者还是有更好的方法?
平台:Unity 3D我们可以通知Subject观察者从通过引用Subject每个观察者都有。
让我用c#来展示一个例子。这是我们的抽象:
public interface IMyObserver
{
public void Update(string myMessage);
public void NotifySubject(string message);
}
public interface IMySubject
{
public void RegisterObserver(IMyObserver o);
public void RemoveObserver(IMyObserver o);
public void NotifyObservers();
public void NotifyMe(string messageFromObserver);
}
及其MyObserver
的具体实现:
public class MyObserver : IMyObserver
{
private MySubject _mySubject;
private string _myMessage;
public MyObserver(MySubject mySubject)
{
_mySubject = mySubject;
_mySubject.RegisterObserver(this);
}
public void NotifySubject(string message)
{
_mySubject.NotifyMe(message);
}
public void Update(string myMessage)
{
_myMessage = myMessage;
Console.WriteLine($"Observer have seen this message: {_myMessage}");
}
}
MySubject
是这样的:
public class MySubject : IMySubject
{
private List<IMyObserver> _observers;
private string _myMessage;
private string _messageFromObserver;
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();
}
public string GetMessage() => _myMessage;
public void NotifyMe(string messageFromObserver)
{
_messageFromObserver = messageFromObserver;
Console.WriteLine($"Subject received this message from observer:
{_messageFromObserver}");
}
}
上面的代码可以这样调用:
MySubject mySubject = new ();
MyObserver myObserver = new (mySubject);
// message from subject
mySubject.SetMessage("Hello World!"); // OUTPUT: Observer have seen this message:
// Hello World!
// message from observer to subject
myObserver.NotifySubject("We are notifying subject"); ; // OUTPUT: Subject
// received this message from observer: We are notifying subject