設計模式之觀察者日常筆記
阿新 • • 發佈:2018-04-05
調用 百度 summary gpo public pub read 控制臺 拷貝
最近在復習C#的基礎知識,今天剛好看到了觀察者模式,便想著在此留下個記錄,方便日後復習。
首先,概念性的東西百度上搜索有很多,這裏就不拷貝黏貼了。下面將用今天看的一個貓和老鼠的例子講解。
1、添加一個控制臺應用程序,添加一個類為Cat
1 /// <summary> 2 /// 被觀察者類 3 /// </summary> 4 public class Cat 5 { 6 private string Name; 7 private string Color; 8 9 publicCat(string name,string color) { 10 this.Name = name; 11 this.Color = color; 12 } 13 14 //模擬被觀察者狀態變化 15 public void CatComing() 16 { 17 Console.WriteLine(Color + "的" + Name + "貓來了!"); 18 } 19 }
2、添加一個老鼠類
1 /// <summary>2 /// 觀察者類 3 /// </summary> 4 public class Mouse 5 { 6 private string Name; 7 private string Color; 8 9 public Mouse(string name, string color) { 10 this.Name = name; 11 this.Color = color; 12 } 13 14 public voidRunAway() { 15 Console.WriteLine(Color + "的" + Name + "老鼠跑了!"); 16 } 17 }
3、接下來我們在控制臺去調用
1 static void Main(string[] args) 2 { 3 Cat cat = new Cat("貓1", "黑色"); 4 Mouse mouse1 = new Mouse("老鼠1", "黑色"); 5 Mouse mouse2 = new Mouse("老鼠2", "白色"); 6 cat.CatComing(); 7 Console.ReadKey(); 8 }
很顯然到現在我們還沒有去使用我們的設計模式,好接下來我們去改造,首先我們會想怎麽讓貓的狀態發生改變時能夠調用老鼠的RunAway方法呢。
那我們是不是能把Cat作為參數傳遞到RunAway不就可以了,就變成下面這樣
1 public void CatComing(Mouse mouse1, Mouse mouse2) { 2 //模擬被觀察者狀態變化 3 public void CatComing() 4 { 5 Console.WriteLine(Color + "的" + Name + "貓來了!"); 6 mouse1.RunAway(); 7 mouse2.RunAway(); 8 }
Main方法調用時只要改成cat.CatComing(mouse1,mouse2);
F5好像可以,但是我們如果新增加一直老鼠,我們是不是又要更改貓類的 CatComing方法,顯然這樣是不合適的,那還有什麽方法呢?
接下來我們繼續改造
1 public void CatComing() 2 { 3 Console.WriteLine(Color + "的" + Name + "貓來了!"); 4 catCome?.Invoke(); //相當於if(catCome!=null) catCome(); 5 } 6 7 //發布消息 8 public event Action catCome;
1 static void Main(string[] args) 2 { 3 Cat cat = new Cat("貓1", "黑色"); 4 Mouse mouse1 = new Mouse("老鼠1", "黑色"); 5 cat.catCome += mouse1.RunAway; //註冊 6 Mouse mouse2 = new Mouse("老鼠2", "白色"); 7 cat.catCome += mouse2.RunAway; //註冊 8 cat.CatComing(); 9 Console.ReadKey(); 10 }
我們使用委托在我們catComing裏面調用這個委托,然後把我們的老鼠的runAway註冊進來,這樣就解決上面的問題了
那如果我們有一百個老鼠類呢 我們是不是要註冊一百次 我們繼續進行修改
1 public Mouse(string name, string color, Cat cat) { 2 this.Name = name; 3 this.Color = color; 4 5 cat.catCome += this.RunAway; 6 }
我們在老鼠類的構造函數上把貓類作為參數傳遞過來,直接在構造函數內註冊
1 static void Main(string[] args) 2 { 3 Cat cat = new Cat("貓1", "黑色"); 4 Mouse mouse1 = new Mouse("老鼠1", "黑色", cat); 5 Mouse mouse2 = new Mouse("老鼠2", "白色", cat); 6 cat.CatComing(); 7 Console.ReadKey(); 8 }
這樣就完成啦。
雖然在園子裏混了那麽久,這還是第一次中規中矩的寫文章,還是有點小激動的哈。
設計模式之觀察者日常筆記