觀察者模式(Observer Pattern)是一種行為型設計模式,通過定義對象間一對多的依賴關係實現狀態變化的自動通知機制,廣泛應用於解耦事件發佈與訂閲場景
適用於
①當一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這兩者封裝在獨立地對象中以使它們可以各自獨立地改變和複用。
②當對一個對象的改變需要同時改變其他對象,而不知道具體有多少對象有待改變時。
③當一個對象必須通知其他對象,而它又不能假定其他對象是誰,即:不希望這些對象是緊耦合的。
類圖如下:

場景:氣象局監測温度
核心代碼如下:
1 internal class Program 2 { 3 static void Main(string[] args) 4 { 5 //Console.WriteLine("Hello, World!"); 6 //創建具體觀察者 7 DisPlay1 disPlay1 = new DisPlay1("顯示屏1"); 8 DisPlay2 disPlay2 = new DisPlay2("顯示屏2"); 9 //創建具體被觀察者 10 WeatherData weatherData = new WeatherData(); 11 weatherData.RedisterObserver(disPlay1); 12 weatherData.RedisterObserver(disPlay2); 13 float temperature = 25; 14 weatherData.SetTemperature(temperature); 15 Console.ReadKey(); 16 } 17 }
1 internal interface Observer 2 { 3 /// <summary> 4 /// 觀察者接口 5 /// </summary> 6 /// <param name="temp">監測對象,具體場景,具體定義參數</param> 7 /// 場景:氣象局監測温度 8 void Update(float temp); 9 }
1 /// <summary> 2 /// 顯示屏 3 /// </summary> 4 internal class DisPlay1 : Observer 5 { 6 private string Name { get; set; } 7 public DisPlay1(string name) 8 { 9 this.Name = name; 10 } 11 public void Update(float temp) 12 { 13 Console.WriteLine($"{Name}當前温度為{temp}攝氏度"); 14 } 15 }
1 /// <summary> 2 /// 顯示屏 3 /// </summary> 4 internal class DisPlay2 : Observer 5 { 6 private string Name { get; set; } 7 public DisPlay2(string name) 8 { 9 this.Name = name; 10 } 11 public void Update(float temp) 12 { 13 Console.WriteLine($"{Name}當前温度為{temp}攝氏度"); 14 } 15 }
1 internal interface Subject 2 { 3 /// <summary> 4 /// 註冊觀察者 5 /// </summary> 6 /// <param name="observer"></param> 7 void RedisterObserver(Observer observer); 8 /// <summary> 9 /// 刪除觀察者 10 /// </summary> 11 /// <param name="observer"></param> 12 void RemoveObserver(Observer observer); 13 /// <summary> 14 /// 通知觀察者 15 /// </summary> 16 void NoticeObserver(); 17 }
1 /// <summary> 2 /// 氣象站 3 /// </summary> 4 internal class WeatherData : Subject 5 { 6 private List<Observer> observers; 7 private float temperature; 8 9 public WeatherData() 10 { 11 observers = new List<Observer>(); 12 } 13 public void SetTemperature(float temperature) 14 { 15 this.temperature = temperature; 16 NoticeObserver(); 17 } 18 public void NoticeObserver() 19 { 20 observers.ForEach(s => s.Update(temperature)); 21 } 22 23 public void RedisterObserver(Observer observer) 24 { 25 //if (observers == null) { } 26 observers.Add(observer); 27 } 28 29 public void RemoveObserver(Observer observer) 30 { 31 observers.Remove(observer); 32 } 33 }