- 觀察者模式一種一對多的關係,讓多個觀察者物件同時監聽某主題物件。物件再狀態發生變化時,會通知觀察者物件,使他門能夠自動更新自己。
- 動機
- 將一個系統分割成一系列相互協作的類別有一個很不好的副作用,那就是需要維護相關物件間的一致性。我們不希望為了維持一致性而使各類別緊密耦合,這樣會給維護、擴展和重用都帶來不便。
- 一個物件的改變需要同時改變其他物件時。且它不知道到底有多少物件有待改變時,應該考慮使用觀察者模式。
using System; using System.Collections; using System.Collections.Generic; namespace DPExample { delegate void EventHandler(); // 通知者界面 interface Subject { void Notify(); string SubjectState { get; set; } } class Boss: Subject { // 宣告委託 public event EventHandler Update; private string action; // 通知 public void Notify() { Update(); } // 老闆狀態 public string SubjectState { get { return action; } set { action = value; } } } class Secretary: Subject { // 宣告委託 public event EventHandler Update; private string action; // 通知 public void Notify() { Update(); } // 老闆狀態 public string SubjectState { get { return action; } set { action = value; } } } // 觀察者 abstract class Observer { protected string name; protected Subject sub; public Observer (string name, Subject sub) { this.name = name; this.sub = sub; } public abstract void Update(); } class StockObserver { private string name; private Subject sub; public StockObserver(string name, Subject sub) { this.name = name; this.sub = sub; } public void CloseStockMarket() { Console.WriteLine ("{0} {1} 關閉股票行情,繼續工作!", sub.SubjectState , name); } } class NBAObserver { private string name; private Subject sub; public NBAObserver(string name, Subject sub) { this.name = name; this.sub = sub; } public void CloseNBADirectSeeding() { Console.WriteLine ("{0} {1} 關閉 NBA 直播,繼續工作!", sub.SubjectState , name); } } }
留言
張貼留言