亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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)文章

  • 如何使用C#將Tensorflow訓練的.pb文件用在生產(chǎn)環(huán)境詳解

    如何使用C#將Tensorflow訓練的.pb文件用在生產(chǎn)環(huán)境詳解

    這篇文章主要給大家介紹了關(guān)于如何使用C#將Tensorflow訓練的.pb文件用在生產(chǎn)環(huán)境的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-11-11
  • 輕松學習C#的基礎(chǔ)入門

    輕松學習C#的基礎(chǔ)入門

    輕松學習C#的基礎(chǔ)入門,了解C#最基本的知識點,C#是一種簡潔的,類型安全的一種完全面向?qū)ο蟮拈_發(fā)語言,是Microsoft專門基于.NET Framework平臺開發(fā)的而量身定做的高級程序設(shè)計語言,需要的朋友可以參考下
    2015-11-11
  • C#實現(xiàn)的圖片、string相互轉(zhuǎn)換類分享

    C#實現(xiàn)的圖片、string相互轉(zhuǎn)換類分享

    這篇文章主要介紹了C#實現(xiàn)的圖片、string相互轉(zhuǎn)換類分享,本文直接給出類代碼,包含相互轉(zhuǎn)換的方法,需要的朋友可以參考下
    2015-03-03
  • .NET連接MongoDB數(shù)據(jù)庫實例教程

    .NET連接MongoDB數(shù)據(jù)庫實例教程

    這則小竅門將講述如何開發(fā)一個.NET應(yīng)用來連接Mongo數(shù)據(jù)庫并執(zhí)行多種操作。同時還稍微涉及了Mongo數(shù)據(jù)庫和多種命令
    2013-11-11
  • C#獲取哈希加密生成隨機安全碼的類實例

    C#獲取哈希加密生成隨機安全碼的類實例

    這篇文章主要介紹了C#獲取哈希加密生成隨機安全碼的類,涉及C#哈希加密及字符串操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#實現(xiàn)獲取一年中是第幾個星期的方法

    C#實現(xiàn)獲取一年中是第幾個星期的方法

    這篇文章主要介紹了C#實現(xiàn)獲取一年中是第幾個星期的方法,比較實用的功能,需要的朋友可以參考下
    2014-08-08
  • winform實現(xiàn)五子棋游戲

    winform實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了winform實現(xiàn)五子棋游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Unity接入高德開放API實現(xiàn)IP定位

    Unity接入高德開放API實現(xiàn)IP定位

    這篇文章主要為大家介紹了Unity如何接入高德開放API實現(xiàn)IP定位功能,文中的示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以參考一下
    2022-04-04
  • C#使用NPOI實現(xiàn)Excel導入導出功能

    C#使用NPOI實現(xiàn)Excel導入導出功能

    這篇文章主要為大家詳細介紹了C#使用NPOI實現(xiàn)Excel導入導出功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#實現(xiàn)軟件監(jiān)控外部程序運行狀態(tài)的方法

    C#實現(xiàn)軟件監(jiān)控外部程序運行狀態(tài)的方法

    這篇文章主要介紹了C#實現(xiàn)軟件監(jiān)控外部程序運行狀態(tài)的方法,可實現(xiàn)監(jiān)控另一個程序的運行狀態(tài)及觸發(fā)相應(yīng)事件的功能,是非常實用的技巧,需要的朋友可以參考下
    2014-12-12

最新評論