Observer設計模式主要包括以下兩種對象:
(1)被觀察對象:Subject,它往往包含其他對象感興趣的東西,上面例子中熱水器中就是Subject(被監視對象);
(2)觀察對象:Observer,它觀察著Subject,當Subject中的某件事發生后,會告知Observer,Obersver會采取相應的行動。上面例子中顯示器和報警器就是觀察對象,當油箱中溫度大于95°時,報警器和顯示器就會做出相應的警報;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ObserverApp {class Program{static void Main(string[] args){Oil o = new Oil();o.BoiledEvent += new Alarm().MakeAlarm;//先往Oil對象中注冊事件o.BoiledEvent += new Display().ShowMsg;//先往Oil對象中注冊事件o.BoilWater();//執行主要方法,等到條件合適在觸發上面注冊的事件 }}/// <summary>/// Subject被觀察對象 ---Oil熱水器/// </summary>internal class Oil{/// <summary>/// 牌子/// </summary>public string brand = "Nick";/// <summary>/// 價格/// </summary>public int price = 1000;public delegate void BoiledHandler(object obj, EventArgs args);public event BoiledHandler BoiledEvent;/// <summary>/// 將觀察者感興趣的信息通過實例傳遞過去/// </summary>public class BoilEventArgs : EventArgs {public int Temperature { get; set; }public BoilEventArgs(int temperature) {this.Temperature = temperature;}}public void BoilWater() {for (int i = 0; i <= 100; i++) {if (i >= 95) {BoilEventArgs args = new BoilEventArgs(i);BoiledEvent(this, args);//當溫度達到95度及以上的時候,觸發所有訂閱該事件的觀察者的方法 }}}}/// <summary>/// Observer觀察對象 ---警報器/// </summary>internal class Alarm {public void MakeAlarm(object sender,EventArgs args) {Oil o = (Oil)sender;ObserverApp.Oil.BoilEventArgs a = (ObserverApp.Oil.BoilEventArgs)args;Console.WriteLine("Alarm:嘀嘀嘀,水已經 {0} 度了,當前熱水器的牌子是{1},價格是{2}",a.Temperature, o.brand, o.price);}}/// <summary>/// Observer觀察對象 ---顯示器/// </summary>internal class Display{public void ShowMsg(object sender, EventArgs args){Oil o = (Oil)sender;ObserverApp.Oil.BoilEventArgs a = (ObserverApp.Oil.BoilEventArgs)args;Console.WriteLine("Display:水已燒開,當前溫度:{0}度,當前熱水器的牌子是{1},價格是{2}", a.Temperature, o.brand, o.price);Console.ReadKey();}} }
?