欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

示例如下:

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

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

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

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

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

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

我們需要解決的問題是:

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

如何看待上面的3個(gè)類:

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

解決方法:

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

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

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

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

總結(jié)如下:

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

相關(guān)文章

最新評(píng)論