文章出處
文章列表
在今天,讀書有時是件“麻煩”事。它需要你付出時間,付出精力,還要付出一份心境。--僅以《大話設計模式》來祭奠那逝去的……
觀察者模式:定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象發生變化時,會通知到所有觀察者對象,使它們能自動更新自己
1.觀察者模式應用
定義抽象通知者(主題)和抽象觀察者,抽象通知者負責增加、移除和通知抽象觀察者,抽象觀察者得到通知的時候更新自己
/// <summary> /// 主題或者抽象通知者 /// </summary> public abstract class Subject { private IList<Observer> observers = new List<Observer>(); /// <summary> /// 增加觀察者 /// </summary> public void Attach(Observer observer) { observers.Add(observer); } /// <summary> /// 移除觀察者 /// </summary> /// <param name="observer"></param> public void Detach(Observer observer) { observers.Remove(observer); } /// <summary> /// 通知觀察者 /// </summary> public void Notify() { foreach (var v in observers) { v.Update(); } } } /// <summary> /// 抽象觀察者(為所有具體觀察者定義的一個接口,在得到主題通知時更新自己) /// </summary> public abstract class Observer { public abstract void Update(); }
定義具體通知者(主題)和具體觀察者,具體觀察者實現具體業務
/// <summary> /// 具體主題或者通知者 /// </summary> public class ConcreteSubject : Subject { public string SubjectState { get; set; } } /// <summary> /// 具體觀察者 /// </summary> public class ConcreteObserver : Observer { private string _name; public ConcreteSubject Subject { get; set; } public ConcreteObserver(ConcreteSubject subject, string name) { this._name = name; this.Subject = subject; } public override void Update() { Console.WriteLine("觀察者{0}:通知者發來最新消息【{1}】", this._name, this.Subject.SubjectState); } }
開啟場景模擬
static void Main(string[] args) { ConcreteSubject s = new ConcreteSubject(); s.Attach(new ConcreteObserver(s, "X")); s.Attach(new ConcreteObserver(s, "Y")); s.Attach(new ConcreteObserver(s, "Z")); s.SubjectState = "ABC"; s.Notify(); }
文章列表
全站熱搜