最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中委托和事件在觀察者模式中的應(yīng)用實例

 更新時間:2014年08月13日 11:38:50   投稿:shichen2014  
這篇文章主要介紹了C#中委托和事件在觀察者模式中的應(yīng)用,需要的朋友可以參考下

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

示例如下:

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

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

運行結(jié)果如下圖所示:

定義被監(jiān)視對象以及觀察者Observer:

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

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

我們需要解決的問題是:

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

如何看待上面的3個類:

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

解決方法:

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

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

3、最后當(dāng)被監(jiān)視對象執(zhí)行方法時觸發(fā)委托類型的事件,從而觸發(fā)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; //委托類型的事件
  
     //適時監(jiān)控
     public void InstanceTrack()
     {
       for (int i = 0; i < 102; i++)
       {
         distance = i;
         if (distance > 100)
         {
           if (TrackEvent != null)
           {
             TrackEvent(distance);
           }
         }
       }
     }   
   }
  
   public class MakerAlertSupplier
   {
     //主人手上的追蹤器終端發(fā)出警報聲
     public void MakeAlert(int param)
     {
       Console.WriteLine("嘀嘀嘀,您的寶貝已經(jīng)離你" + param + "米之外了,要注意哦~~");
     }
   }
  
   public class ShowAlertSupplier
   {
     //主人手上的追蹤器終端顯示報警信息
     public static void ShowAlert(int param)
     {
       Console.WriteLine("您的寶貝已經(jīng)離你" + param + "米之外了,要注意哦~~");
     }
   }

運行結(jié)果如下圖所示:

總結(jié)如下:

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

相關(guān)文章

  • WPF使用Accord實現(xiàn)屏幕錄制功能

    WPF使用Accord實現(xiàn)屏幕錄制功能

    這篇文章主要為大家詳細(xì)介紹了WPF如何使用Accord實現(xiàn)屏幕錄制,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2024-03-03
  • C# 中使用NModbus4通信庫執(zhí)行寫操作

    C# 中使用NModbus4通信庫執(zhí)行寫操作

    在C#中NModbus4庫提供了一個方便的方式來與支持Modbus協(xié)議的設(shè)備進行交互,本文就來介紹了使用NModbus4通信庫執(zhí)行寫操作,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 使用C#代碼獲取存儲過程返回值

    使用C#代碼獲取存儲過程返回值

    這篇文章主要介紹了使用C#代碼獲取存儲過程返回值,需要的朋友可以參考下
    2015-11-11
  • 基于WPF實現(xiàn)簡單的值轉(zhuǎn)換器

    基于WPF實現(xiàn)簡單的值轉(zhuǎn)換器

    值轉(zhuǎn)換器是?WPF?項目中具有特色的組成部分,這篇文章將帶大家實現(xiàn)一個標(biāo)準(zhǔn)的值轉(zhuǎn)換器,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2025-02-02
  • 利用unity代碼C#封裝為dll的步驟分享

    利用unity代碼C#封裝為dll的步驟分享

    這篇文章主要給大家介紹了關(guān)于利用unity代碼C#封裝為dll的相關(guān)資料,文中通過圖文將實現(xiàn)的方法介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • C#Windows窗體設(shè)計之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用

    C#Windows窗體設(shè)計之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用

    這篇文章主要介紹了C#Windows窗體設(shè)計之ContextMenuStrip(鼠標(biāo)右擊菜單)的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • C#中分部方法和分部類分析

    C#中分部方法和分部類分析

    這篇文章主要介紹了C#中分部方法和分部類基本用法,并且較為詳細(xì)的分析了分部方法和分部類使用時的注意事項,需要的朋友可以參考下
    2014-11-11
  • unity android設(shè)備上查看log輸出方式

    unity android設(shè)備上查看log輸出方式

    這篇文章主要介紹了unity android設(shè)備上查看log輸出方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C# 16進制與字符串、字節(jié)數(shù)組之間的轉(zhuǎn)換

    C# 16進制與字符串、字節(jié)數(shù)組之間的轉(zhuǎn)換

    在串口通訊過程中,經(jīng)常要用到 16進制與字符串、字節(jié)數(shù)組之間的轉(zhuǎn)換
    2009-05-05
  • C# 中如何使用Thread

    C# 中如何使用Thread

    這篇文章主要介紹了C# 中使用 Thread的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01

最新評論

突泉县| 夹江县| 响水县| 遂昌县| 横峰县| 通江县| 清流县| 揭阳市| 长武县| 资阳市| 新沂市| 南澳县| 红安县| 清苑县| 旺苍县| 黄石市| 迁安市| 徐闻县| 新宾| 呼图壁县| 教育| 尉氏县| 海林市| 彩票| 张家港市| 蚌埠市| 田阳县| 龙陵县| 丰城市| 通海县| 垣曲县| 清徐县| 延庆县| 军事| 芮城县| 同仁县| 马关县| 凉城县| 资讯 | 新邵县| 元阳县|