設計模式系列 - 觀察者模式
阿新 • • 發佈:2019-01-05
oct alt tst 其他 上層 改變 args 進行 pda
當對象之間存在一對多的關系時,若需要進行對象之間的通知,則可使用觀察者模式
介紹
觀察者模式屬於行為型模式,當一個對象的狀態發生改變時,若我們想通知其他對象,此時可通過觀察者模式來進行解決。
類圖描述
代碼實現
1、定義抽象觀察者
public abstract class Observer
{
protected Subject subject;
public abstract void Update();
}
2、定義觀察者管理類
public class Subject { private List<Observer> observers = new List<Observer>(); private int state; public int GetState() => this.state; public void SetState(int state) { this.state = state; NitifyAllObservers(); } public void Attach(Observer observer) { observers.Add(observer); } private void NitifyAllObservers() { foreach (var observer in observers) { observer.Update(); } } }
3、定義具體觀察者
public class BinaryObserver : Observer { public BinaryObserver(Subject subject) { this.subject = subject; this.subject.Attach(this); } public override void Update() { Console.WriteLine($"Binary string:{subject.GetState()}"); } } public class HexaObserver:Observer { public HexaObserver(Subject subject) { this.subject = subject; this.subject.Attach(this); } public override void Update() { Console.WriteLine($"Hex string:{subject.GetState()}"); } } public class OctalObserver:Observer { public OctalObserver(Subject subject) { this.subject = subject; this.subject.Attach(this); } public override void Update() { Console.WriteLine($"Octal string:{subject.GetState()}"); } }
4、上層調用
class Program { static void Main(string[] args) { Subject subject = new Subject(); new HexaObserver(subject); new OctalObserver(subject); new BinaryObserver(subject); Console.WriteLine("First state change:15"); subject.SetState(15); Console.WriteLine("Second state change:10"); subject.SetState(10); Console.ReadKey(); } }
總結
觀察者模式通過一種集合方式將所有觀察者管理起來,並最終循環遍歷通知所有對象。
設計模式系列 - 觀察者模式