【案例】有個高檔的熱水器,包含一個加熱器,一個報警器和一個現實屏,我們給熱水器它通上電,當水溫超過95度的時候:
1、報警器會開始發出語音,告訴你水的溫度;
2、液晶屏也會改變水溫的顯示,來提示水已經快燒開了。
請使用觀察者模式Observer表述上述三個關系,並在main方法里進行測試。
代碼如下:
namespace ConsoleApp1 { class Program { static void Main(string[] args) { Heater ht = new Heater(); Alarm alarm = new Alarm(); Display display = new Display(); ht.BoilEvert += alarm.MakeAlert; ht.BoilEvert += display.ShowMsg; ht.BoilWater(); Console.Read(); } } public class Heater { private int temperature; public delegate void BoilHandler(int param); public event BoilHandler BoilEvert; public void BoilWater() { for (int i = 0; i <= 100; i++) { temperature = i; if (temperature > 95) { if (BoilEvert != null) { BoilEvert(temperature); } } } } } public class Alarm { public void MakeAlert(int param) { Console.WriteLine("alarm:滴滴滴,水已經有{0}度了", param); } } public class Display { public void ShowMsg(int param) { Console.WriteLine("display:水快開了,當前溫度:{0}度", param); } } }
運行結果如下圖所示:
【案例】有一家三口,媽媽負責做飯,爸爸和孩子負責吃。。。將這三個人,想象成三個類。
媽媽有一個方法,叫做“做飯”。有一個事件,叫做“開飯”。做完飯后,調用開發事件,發布開飯消息。
爸爸和孩子分別有一個方法,叫做“吃飯”。
在main方法里,將爸爸和孩子的“吃飯”方法,注冊到媽媽的“開飯”事件。也就是,訂閱媽媽的開飯消息。讓媽媽做完飯開飯時,發布吃飯消息時,告訴爸爸和孩子一聲。
代碼如下:
namespace ConsoleApp2 { class Program { static void Main(string[] args) { Mom mom = new Mom(); Dad dad = new Dad(); Son son = new Son(); mom.EatEvent += son.Eat; mom.EatEvent += dad.Eat; mom.Cook(); Console.ReadLine(); } } public class Mom { public delegate void EatHandler(); public event EatHandler EatEvent; private void OnEat() { if (EatEvent != null) { EatEvent(); } } public void Cook() { Console.WriteLine("媽媽開始煮飯"); Console.WriteLine("媽媽開始炒菜"); OnEat(); } } public class Dad { public void Eat() { Console.WriteLine("爸爸:好的我這就來吃飯"); } } public class Son { public void Eat() { Console.WriteLine("兒子:等一會就去吃飯 "); } } }
運行結果如下圖所示: