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();
}
}
轉自:
最後更新:2017-04-03 20:19:32