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

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

 更新時間:2014年08月13日 11:38:50   投稿:shichen2014  
這篇文章主要介紹了C#中委托和事件在觀察者模式中的應(yī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ù)列表,我們當然可以在被監(jiān)視對象中定義一個委托,與observer方法有相同的參數(shù)列表。

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

3、最后當被監(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)屏幕錄制功能

    這篇文章主要為大家詳細介紹了WPF如何使用Accord實現(xiàn)屏幕錄制,文中的示例代碼講解詳細,對我們學(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)一個標準的值轉(zhuǎn)換器,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下
    2025-02-02
  • 利用unity代碼C#封裝為dll的步驟分享

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

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

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

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

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

    這篇文章主要介紹了C#中分部方法和分部類基本用法,并且較為詳細的分析了分部方法和分部類使用時的注意事項,需要的朋友可以參考下
    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

最新評論

黔西| 永丰县| 龙海市| 弥渡县| 台北县| 钟祥市| 双峰县| 潜江市| 新竹县| 新河县| 汪清县| 阿鲁科尔沁旗| 江永县| 肇庆市| 千阳县| 宁乡县| 霞浦县| 隆林| 宣武区| 西乌珠穆沁旗| 丹江口市| 柘荣县| 天津市| 正阳县| 甘南县| 肃南| 东乌| 武功县| 惠安县| 邵阳市| 奎屯市| 阿城市| 宜宾县| 鹤岗市| 泰和县| 罗定市| 德惠市| 钟山县| 冀州市| 许昌县| 富平县|