观察者模式与反观察者?



按照通常的观察者模式,我有一个观察者和一个主题。

但是我还需要通知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

相关内容

  • 没有找到相关文章