一、定義 觀察者模式(Observer Pattern)是設計模式中行為模式的一種,它解決了上述具有一對多依賴關係的對象的重用問題。此模式的參與者分為兩大類,一類是被觀察的目標,另一類是觀察該目標的觀察者們。正因為該模式是基於“一對多”的關係,所以該模式一般是應用於由一個目標對象和N個觀察者對象組成 ...
一、定義
觀察者模式(Observer Pattern)是設計模式中行為模式的一種,它解決了上述具有一對多依賴關係的對象的重用問題。此模式的參與者分為兩大類,一類是被觀察的目標,另一類是觀察該目標的觀察者們。正因為該模式是基於“一對多”的關係,所以該模式一般是應用於由一個目標對象和N個觀察者對象組成(當然也可以擴展為有多個目標對象,但我們現在只討論前者)的場合。當目標對象的狀態發生改變或做出某種行為時,正在觀察該目標對象的觀察者們將自動地、連鎖地作出相應的響應行為。
二、測試事例
貓來了,老鼠走了。
其中貓為被觀察的目標,老鼠為觀察者,當貓來了行為發生時,老鼠們會做出逃跑的響應行為。
1. 貓和老鼠封裝類
1 class Cat 2 { 3 private string name; 4 private string color; 5 6 public Cat(string name, string color) 7 { 8 this.name = name; 9 this.color = color; 10 } 11 12 /// <summary> 13 /// 貓進屋(貓的狀態發生改變) 14 /// </summary> 15 public void CatComing() 16 { 17 Console.WriteLine("貓來了"); 18 19 if (catCome != null) 20 catCome(); 21 } 22 public Action catCome; // 委托 23 }
1 class Mouse 2 { 3 private string name; 4 private string color; 5 6 public Mouse(string name, string color) 7 { 8 this.name = name; 9 this.color = color; 10 } 11 12 /// <summary> 13 /// 逃跑功能 14 /// </summary> 15 public void RunAway() 16 { 17 Console.WriteLine(color + "的老鼠" + name + "跑了"); 18 } 19 }
2. 測試代碼
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 6 7 Cat cat = new Cat("加菲貓", "黃色"); 8 Mouse mouse1=new Mouse("米奇","黑色"); 9 Mouse mouse2 = new Mouse("唐老鴨", "紅色"); 10 11 cat.catCome += mouse1.RunAway; // 多播委托 12 cat.catCome += mouse2.RunAway; 13 14 cat.CatComing(); // 貓的狀態發生變化 15 16 //多一隻老鼠,不應該修改貓的類。 17 Console.ReadKey(); 18 19 } 20 }
3. 運行截圖
三、適用場景
- 當對一個對象的改變需要同時改變其他對象,而又不知道具體有多少對象有待改變的情況下。
- 當一個對象必須通知其他對象,而又不能假定其他對象是誰的情況下。