1. 程式人生 > >設計模式之觀察者日常筆記

設計模式之觀察者日常筆記

調用 百度 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         public
Cat(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 void
RunAway() { 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         }

這樣就完成啦。

雖然在園子裏混了那麽久,這還是第一次中規中矩的寫文章,還是有點小激動的哈。

設計模式之觀察者日常筆記