1. 程式人生 > >事件模擬場景:貓叫->老鼠逃跑 & 主人驚醒

事件模擬場景:貓叫->老鼠逃跑 & 主人驚醒

  這是一個典型的觀察者模式的應用場景,事件的發源在於貓叫這個動作,在貓叫之後,老鼠開始逃跑,而主人則會從睡夢中驚醒。可以發現,主人和老鼠這兩個型別的動作相互之間沒有聯絡,但都是由貓叫這一事件觸發的。

  設計的大致思路在於,貓類包含並維護一個貓叫的動作,主人和老鼠的物件例項需要訂閱貓叫這一事件,保證貓叫這一事件發生時主人和老鼠可以執行相應的動作。

  (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,此時就會通知所有這一事件的訂閱者。本場景的關鍵之處就在於主人和老鼠的動作應該完全由貓叫來觸發。下面是場景模擬程式碼的執行結果: