事件模擬場景:貓叫->老鼠逃跑 & 主人驚醒
阿新 • • 發佈:2019-02-20
這是一個典型的觀察者模式的應用場景,事件的發源在於貓叫這個動作,在貓叫之後,老鼠開始逃跑,而主人則會從睡夢中驚醒。可以發現,主人和老鼠這兩個型別的動作相互之間沒有聯絡,但都是由貓叫這一事件觸發的。
設計的大致思路在於,貓類包含並維護一個貓叫的動作,主人和老鼠的物件例項需要訂閱貓叫這一事件,保證貓叫這一事件發生時主人和老鼠可以執行相應的動作。
(1)設計貓類,為其定義一個貓叫的事件CatCryEvent:
public class Cat { private string name; // 貓叫的事件 public event EventHandler<CatCryEventArgs> CatCryEvent; public Cat(string name) { this.name = name; } // 觸發貓叫事件 public void CatCry() { // 初始化事件引數 CatCryEventArgs args = new CatCryEventArgs(name); Console.WriteLine(args); // 開始觸發事件 CatCryEvent(this, args); } } public class CatCryEventArgs : EventArgs { private string catName; public CatCryEventArgs(string catName) : base() { this.catName = catName; } public override string ToString() { string message = string.Format("{0}叫了", catName); return message; } }
(2)設計老鼠類,在其構造方法中訂閱貓叫事件,並提供對應的處理方法
public class Mouse { private string name; // 在構造方法中訂閱事件 public Mouse(string name, Cat cat) { this.name = name; cat.CatCryEvent += CatCryEventHandler; } // 貓叫的處理方法 private void CatCryEventHandler(object sender, CatCryEventArgs e) { Run(); } // 逃跑方法 private void Run() { Console.WriteLine("{0}逃走了:我勒個去,趕緊跑啊!", name); } }
(3)設計主人類,在其構造犯法中訂閱貓叫事件,並提供對應的處理方法
public class Master { private string name; // 在構造方法中訂閱事件 public Master(string name, Cat cat) { this.name = name; cat.CatCryEvent += CatCryEventHandler; } // 針對貓叫的處理方法 private void CatCryEventHandler(object sender, CatCryEventArgs e) { WakeUp(); } // 具體的處理方法——驚醒 private void WakeUp() { Console.WriteLine("{0}醒了:我勒個去,叫個錘子!", name); } }
(4)最後在Main方法中進行場景的模擬:
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("假老練");
Mouse mouse1 = new Mouse("風車車", cat);
Mouse mouse2 = new Mouse("米奇妙", cat);
Master master = new Master("李扯火", cat);
// 毛開始叫了,老鼠和主人有不同的反應
cat.CatCry();
Console.ReadKey();
}
}
這裡定義了一隻貓,兩隻老鼠與一個主人,當貓的CatCry方法被執行到時,會觸發貓叫事件CatCryEvent,此時就會通知所有這一事件的訂閱者。本場景的關鍵之處就在於主人和老鼠的動作應該完全由貓叫來觸發。下面是場景模擬程式碼的執行結果: