一.介紹
觀察者模式(Observer Pattern)。屬於行為型模式。它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
二.實現
舉個例子,我們開車時,當踩油門加速的時候,顯示器上會顯示車速,而超速的話,警報器會發出警報。車只是在加速,而顯示器和警報器卻可以監聽到車速的變化。
//系統 public abstract class System { //加速,踩油門 public abstract void Accelerate(int speed); } //顯示器 public class Screen : System { public override void Accelerate(int speed) { Console.WriteLine("車速" + speed); } } //警報鈴 public class Alarm : System { public override void Accelerate(int speed) { if (speed >= 100) { Console.WriteLine("嗶嗶,已經超速"); } } } //交通工具 public abstract class Vehicle { public List<System> systems = new List<System>(); //裝系統 public void Attach(System obs) { systems.Add(obs); } //卸載系統 public void Detach(System obs) { systems.Remove(obs); } public void Notify(int speed) { systems.ForEach(o => o.Accelerate(speed)); } } //汽車 public class Car : Vehicle { private int speed;//速度 protected void Accelerate(int speed) { base.Notify(speed); } //開車 public void Go() { for (int i = 0; i <= 99; i++) { speed = i + 1; if (speed > 95) { Accelerate(speed); } } } } //調用 public static void Main(string[] args) { Car car = new Car(); System screen = new Screen(); System alarm = new Alarm(); car.Attach(screen);//開啟顯示器 car.Attach(alarm);//開啟警報器 car.Go(); }
汽車Car作為發布信息的主體,系統System如顯示器、警報器則監聽汽車的信息。為了降低耦合,汽車使用“發布-訂閱”的方式,而不是直接調用系統的方法。Car用訂閱列表來存放需要使用的系統,等需要發布的時候,再通知到已經訂閱的各個系統中。
在C#中,我們還可以使用委托和事件的方式去實現觀察者模式,委托就相當訂閱列表,當目標觸發了委托之中的事件時,則委托就會自動去調用觀察者注冊的方法。
//交通工具 public abstract class Vehicle { public delegate void Handler(int speed);//定義委托類型 public event Handler Event;//綁定委托的事件 //裝系統 public void Attach(System obs) { Event += obs.Accelerate;//在委托中增加方法 } //卸載系統 public void Detach(System obs) { Event -= obs.Accelerate;//在委托中減少方法 } public void Notify(int speed) { if (Event != null) { Event(speed); } } } //。。。 //其它代碼實現和上面例子一樣
3.總結
優點:
1.將一個目標對象的變化通知到觀察者類。
2.使得目標對象和觀察者對象解耦,如果需要添加新的觀察者,只需要在抽象類上拓展並訂閱即可。