觀察者模式優點
- 分離關注點:表示層與資料邏輯層解耦
- 穩定通訊機制:定義標準更新訊息傳遞
- 介面抽象:支援多種不同表示層(觀察者)
- 抽象耦合:被觀察者僅知抽象觀察者介面,不知具體類別
- 層次分離:雙方可屬於不同抽象化層次
- 廣播通訊:自動通知所有登記觀察者
觀察者模式缺點
- 介面強制繼承:所有觀察者必須實作抽象介面,第三方類別無法直接使用(需 Adapter 模式包裝,增加複雜度)
- 通知效能:大量觀察者時逐一通知耗時
- 循環依賴風險:觀察者間若有循環依賴,觸發遞迴調用導致系統崩潰
- 異步投遞一致性:跨執行緒通知需保證自恰性
- 變更細節缺失:觀察者知曉「有變更」但不知「如何變更」
實務建議
- 觀察者數量大時考慮批次通知或非同步處理
- 嚴禁觀察者之間形成循環引用
- 跨執行緒通知使用
SynchronizationContext 或 Dispatcher 確保執行緒安全
- 若需變更細節,在通知中攜帶具體變更資訊(如舊值/新值、屬性名稱)
- 考慮 .NET 事件模式(
event/delegate)作為內建替代方案
與 .NET 事件模式對比
觀察者模式是設計模式層面的架構決策;.NET 事件是語言層面的實作支援。兩者可結合:觀察者介面定義契約,事件機制簡化訂閱/發布實作。