// 觀察者介面
public interface IObserver
{
void Notify(object data);
}
// 被觀察者介面
public interface IObservable
{
void Register(IObserver observer);
void UnRegister(IObserver observer);
}
// 所有被觀察者的共用基類
public abstract class ObservableImpl : IObservable
{
protected Hashtable _observers = new Hashtable();
public void Register(IObserver o) => _observers.Add(o, o);
public void UnRegister(IObserver o) => _observers.Remove(o);
public void NotifyObservers(object data)
{
foreach (IObserver o in _observers.Keys)
o.Notify(data);
}
}
// 業務資料(被觀察者)
public class StockData : ObservableImpl
{
private float _price;
public float Price
{
set { _price = value; base.NotifyObservers(_price); }
}
}
// 使用者介面(觀察者)
public class StockDisplay : IObserver
{
public void Notify(object data)
{
Console.WriteLine($"新價格: {data}");
}
}
public class Program
{
public static void Main()
{
var ui = new StockDisplay();
var data = new StockData();
data.Register(ui);
data.Price = 1000f; // 觸發通知
data.UnRegister(ui); // 解除觀察
}
}
上述為傳統介面導向實作。.NET 原生 delegate + event 機制可進一步解耦:被觀察者僅需公開 event,觀察者以 +=/-= 訂閱/退訂,無須實作 IObservable、手動管理容器,彈性更高、程式碼更簡潔。