国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中委托和事件在觀察者模式中的應用實例

2020-01-24 02:32:03
字體:
來源:轉載
供稿:網友

通常來說當一個被監視對象的方法執行會觸發觀察者Observer的方法的時候,我們就可以在被監視對象中聲明委托和事件。本文就以實例形式展示了C#中實現委托和事件在觀察者模式中的應用。具體如下:

示例如下:

有一個寵物追蹤器掛寵物身上,只要寵物離開主人100米之外,主人手上的顯示器顯示警告信息并聲音報警。

   class Program   {     static void Main(string[] args)     {       PetTracker tracker = new PetTracker();       tracker.InstanceTrack();       Console.ReadKey();     }   }     public class PetTracker   {     private int distance;       //適時監控     public void InstanceTrack()     {       for (int i = 0; i < 102; i++)       {         distance = i;         if (distance > 100)         {           MakeAlert(distance);           ShowAlert(distance);         }       }     }       //主人手上的追蹤器終端發出警報聲     private void MakeAlert(int param)     {       Console.WriteLine("嘀嘀嘀,您的寶貝已經離你" + param + "米之外了,要注意哦~~");     }       //主人手上的追蹤器終端顯示報警信息     private void ShowAlert(int param)     {       Console.WriteLine("您的寶貝已經離你" + param + "米之外了,要注意哦~~");     }   }

運行結果如下圖所示:

定義被監視對象以及觀察者Observer:

假如把以上3個方法封裝到不同的類中去,那就是:

   public class PetTracker   {     private int distance;       //適時監控     public void InstanceTrack()     {       for (int i = 0; i < 102; i++)       {         distance = i;         if (distance > 100)         {           }       }     }      }     public class MakerAlertSupplier   {     //主人手上的追蹤器終端發出警報聲     public void MakeAlert(int param)     {       Console.WriteLine("嘀嘀嘀,您的寶貝已經離你" + param + "米之外了,要注意哦~~");     }   }     public class ShowAlertSupplier   {     //主人手上的追蹤器終端顯示報警信息     public static void ShowAlert(int param)     {       Console.WriteLine("您的寶貝已經離你" + param + "米之外了,要注意哦~~");     }   }

我們需要解決的問題是:

在PetTracker類的InstanceTrack()方法中,一旦distance > 100,該如何通知MakerAlertSupplier和ShowAleartSupplier呢?

如何看待上面的3個類:

● PetTracker可以看作是被監視對象。
● MakerAlertSupplier和ShowAleartSupplier看作是觀察者,即Observer。

解決方法:

1、考慮到Observer的方法參數都是int類型,嗯是的,不同的方法名,相同的參數列表,我們當然可以在被監視對象中定義一個委托,與observer方法有相同的參數列表。

2、如何做到被監視對象的委托被觸發從而觸發Observer的方法呢?我們需要一個委托類型的事件,通過事件變量,把Observer的方法綁定到委托上。

3、最后當被監視對象執行方法時觸發委托類型的事件,從而觸發Observer的方法。

完整代碼如下:

   class Program   {     static void Main(string[] args)     {       PetTracker tracker = new PetTracker();       tracker.TrackEvent += (new MakerAlertSupplier()).MakeAlert;       tracker.TrackEvent += ShowAlertSupplier.ShowAlert;         tracker.InstanceTrack();       Console.ReadKey();     }   }     public class PetTracker   {     private int distance;       public delegate void TrackHandler(int param); //委托     public event TrackHandler TrackEvent; //委托類型的事件       //適時監控     public void InstanceTrack()     {       for (int i = 0; i < 102; i++)       {         distance = i;         if (distance > 100)         {           if (TrackEvent != null)           {             TrackEvent(distance);           }         }       }     }      }     public class MakerAlertSupplier   {     //主人手上的追蹤器終端發出警報聲     public void MakeAlert(int param)     {       Console.WriteLine("嘀嘀嘀,您的寶貝已經離你" + param + "米之外了,要注意哦~~");     }   }     public class ShowAlertSupplier   {     //主人手上的追蹤器終端顯示報警信息     public static void ShowAlert(int param)     {       Console.WriteLine("您的寶貝已經離你" + param + "米之外了,要注意哦~~");     }   }

運行結果如下圖所示:

總結如下:

● 對于方法名不同,參數列表相同的多個類方法或方法,委托抽象了他們的定義。
● 而委托的執行和注冊就交給了委托類型的事件來做。
● 委托是局限在被監視對象內部的,雖然聲明是public,但在客戶端不能給被監視對象的委托變量賦值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 合肥市| 七台河市| 龙里县| 三亚市| 镇巴县| 丰都县| 日土县| 泗阳县| 临汾市| 赞皇县| 盖州市| 泰顺县| 民丰县| 偃师市| 新乡市| 信丰县| 栾城县| 大余县| 福贡县| 平江县| 木兰县| 招远市| 固安县| 延边| 宁海县| 麻阳| 桓台县| 弥渡县| 库尔勒市| 乌鲁木齐县| 西畴县| 嵊州市| 随州市| 阿拉善右旗| 上思县| 贵州省| 炉霍县| 平谷区| 嫩江县| 通城县| 历史|