首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 觀察者模式實作(二)

     編輯:關於C語言

基礎介面與抽象基類


// 觀察者介面
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);
    }
}

具體業務類別與 UI 觀察者


// 業務資料(被觀察者)
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 事件模式的優勢

上述為傳統介面導向實作。.NET 原生 delegate + event 機制可進一步解耦:被觀察者僅需公開 event,觀察者以 +=/-= 訂閱/退訂,無須實作 IObservable、手動管理容器,彈性更高、程式碼更簡潔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved