閱讀732 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C#事件和觀察者設計模式

 

Observer設計模式簡介
現在假設熱水器由三部分組成:熱水器、警報器、顯示器,它們來自於不同廠商並進行了組裝。那麼,應該是熱水器僅僅負責燒水,它不能發出警報也不能顯示水溫;在水燒開時由警報器發出警報、顯示器顯示提示和水溫。

 

Observer 設計模式中主要包括如下兩類對象

Subject:監視對象,它往往包含著其他對象所感興趣的內容。在本範例中,熱水器就是一個監視對象,它包含的其他對象所感興趣的內容,就是temprature字段。當這個字段的值快到 100 時,會不斷把數據發給監視它的對象。 
    
Observer:監視者,它監視 Subject,當 Subject中的某件事發生的時候,會告知Observer,而Observer則會采取相應的行動。在本範例中,Observer有警報器和顯示器,它們采取的行動分別是發出警報和顯示水溫。

 

在本例中,事情發生的順序應該是這樣的:

1.警報器和顯示器告訴熱水器,它對它的溫度比較感興趣(注冊)。 
2.熱水器知道後保留對警報器和顯示器的引用。 
3.熱水器進行燒水這一動作,當水溫超過 95 度時,通過對警報器和顯示器的引用,自動調用警報器的 MakeAlert

 ()方法、顯示器的 ShowMsg()方法

 

    /// <summary>
    /// 熱水器
    /// </summary>
    class Heater
    {
        public int temperature;                                   // 監視對象
        public delegate void BoilWaterHandler(int temperature);   // 聲明委托
        public event BoilWaterHandler BoilWaterEvent;             // 注冊事件
   
        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature > 95)
                {
                    if (BoilWaterEvent != null)
                    {
                        BoilWaterEvent(temperature);
                    }
                }
            }
        }
    }

    /// <summary>
    /// 警報器
    /// </summary>
    public class Alarm
    {
        public void MakeAlert(int temp)
        {
            Console.WriteLine("Alarm:嘀嘀嘀,水已經 {0} 度了:", temp);
        }
    }

 

    /// <summary>
    /// 顯示器
    /// </summary>
    public class Show
    {
        public void ShowMsg(int temp)
        {
            Console.WriteLine("Display:水快燒開了,當前溫度:{0}度。", temp);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Heater Myheater = new Heater();
            Alarm MyAlarm = new Alarm();
            Show Myshow = new Show();

            Myheater.BoilWaterEvent += MyAlarm.MakeAlert;
            Myheater.BoilWaterEvent += Myshow.ShowMsg;       

           // Myheater.BoilWaterEvent+=(new Show()).ShowMsg;
            Myheater.BoilWater();                             // 燒水,會自動調用注冊過對象的方法

            Console.ReadLine();
        }
    }

 

轉自:

張子陽
www.tracefact.net

最後更新:2017-04-02 22:16:00

  上一篇:go JS中使用正則表達式
  下一篇:go DirectoryInfo的用法(怎麼判斷文件隻讀)