<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C#事件(event)的理解

      一、多播委托的應用--觀察者模式

      遇到一個開發的問題?
      面試者:以面向對象的思想實現一下的場景:
      貓:Miao一聲,緊接著引發了一系列的行為~
      Miao:引發了一系列的動作;

      從代碼層面來說:代碼這樣寫好嗎?

      1. 貓職責不單一(貓就是貓,他的行為只有Miao一聲)
      2. 依賴太重,依賴了很多的普通類; 被依賴的類如果修改,可能會引發這個貓也要修改;---代碼不穩定;
      3. 如果要控制順序---也要修改代碼; 有新需求,必須要修改歷史代碼---開閉原則;

      從傳統的方式去考慮的話,我們可能會寫出來這個如此這樣的代碼

      class Dog
      {
          public void Bark()
          {
              Console.WriteLine("Dog Bark!");
      
          }
      }
      
      class Fox
      {
          public void Eat()
          {
              Console.WriteLine("Fox Eat!");
      
          }
          
      }
      
      class Cat
      {
          public void Miao()
          {
              new Fox().Eat();
              new Dog().Bark();
      
              Console.WriteLine("Cat Miao!");
          }
      }
      

      從代碼層面來說:代碼這樣寫好嗎?

      1. 貓職責不單一(貓就是貓,他的行為只有Miao一聲)
      2. 依賴太重,依賴了很多的普通類; 被依賴的類如果修改,可能會引發這個貓也要修改;---代碼不穩定;
      3. 如果要控制順序---也要修改代碼; 有新需求,必須要修改歷史代碼---開閉原則;

      如何解決呢? 第一個問題:讓貓的職責單一, 后續觸發的行為,貓Miao一聲之后,只負責觸發; 觸發的是一堆的行為;
      請問:如果要希望在觸發一個行為后,能夠執行多個行為,執行一系列的行為?? 怎么辦?-------多播委托;

      核心:把依賴的東西轉移到上端,保證當前類的穩定; ----可以做到解耦
      二者實現本質:是相通的; 都是類似于一個盒子, OOP: 盒子中裝對象 委托:盒子裝方法;

      通過OOP 繼承實現的ObServer
      IObject.cs

       public interface IObject
       {
           public void DoAction();
      
       }
      

      Baby.cs

      public class Baby:IObject
      {
         public void Cry()
          {
              Console.WriteLine("Baby Cry");
          }
      
          public void DoAction()
          {
              Cry();
          }
      }
      
      

      Brother.cs

       public class Brother:IObject
       {
           public void Turn()
           {
               Console.WriteLine("Brother Turn");
           }
      
           public void DoAction()
           {
               Turn();
           }
       }
      

      Dog.cs

       public class Dog:IObject
       {
           public void Wang()
           {
               Console.WriteLine("Dog Wang");
           }
      
           public void DoAction()
           {
               Wang();
           }
       }
      

      Father.cs

       public class Father:IObject
       {
           public void Roar()
           {
               Console.WriteLine("Father Roar");
           }
      
           public void DoAction()
           {
               Roar();
           }
       }
      

      Mother.cs

       public class Mother:IObject
       {
           public void Wispher()
           {
               Console.WriteLine("Mother Wispher");
           }
      
           public void DoAction()
           {
               Wispher();
           }
       }
      

      Mouse.cs

       public class Mouse:IObject
       {
           public void Run()
           {
               Console.WriteLine("Mouse Run");
           }
           public void DoAction()
           {
               Run();
           }
       }
      

      Neighbor.cs

      public class Neighbor:IObject
      {
          public void Awake()
          {
              Console.WriteLine("Neighbor Awake");
          }
          public void DoAction()
          {
              Awake();
          }
      
      }
      

      Stealer.cs

      public class Stealer:IObject
      {
          public void Hide()
          {
              Console.WriteLine("Stealer Hide");
          }
          public void DoAction()
          {
              Hide();
          }
      }
      

      Cat.cs

      public class Cat
      {  
          public List<IObject> ObserList=new List<IObject>(); 
          public void MiaoObserver()
          {
              Console.WriteLine($"{this.GetType().Name} MiaoObserver========");
              foreach ( IObject item in ObserList )
              { 
                  item.DoAction();
              } 
          }
      }
      

      Progarm.cs

      Console.WriteLine("=========================================");
      Console.WriteLine("=========================================");
      {
          Cat cat = new Cat();
          cat.objects.Add(new Baby());
          cat.objects.Add(new Mother());
          cat.objects.Add(new Dog());
          cat.objects.Add(new Mouse());
          cat.objects.Add(new Father());
          cat.objects.Add(new Neighbor());
          cat.objects.Add(new Stealer());
          cat.objects.Add(new Brother());
          cat.MiaoObserver();
      }
      Console.WriteLine("=========================================");
      Console.WriteLine("=========================================");
      
      

      通過委托實現
      cat.cs

      public Action? MiaoDelegate;
      
      public void MiaoDelegateObserver()
      {
          Console.WriteLine($"{this.GetType().Name} MiaoDelegateObserver========");
          if (MiaoDelegate != null)
          {
              MiaoDelegate();
          }
      }
      

      program.cs

      Console.WriteLine("=========================================");
      Console.WriteLine("=========================================");
      {
          Cat cat = new Cat();
          cat.MiaoDelegate += new Baby().Cry;
          cat.MiaoDelegate += new Mother().Wispher;
          cat.MiaoDelegate += new Dog().Wang;
          cat.MiaoDelegate += new Mouse().Run;
          cat.MiaoDelegate += new Father().Roar;
          cat.MiaoDelegate += new Neighbor().Awake;
          cat.MiaoDelegate += new Stealer().Hide;
          cat.MiaoDelegate += new Brother().Turn;
          //cat.ActionHander -= new Baby().Cry;
          //  cat.ActionHander.Invoke();// 委托可以在定義委托所在類的外部去執行;
          cat.MiaoDelegateObserver();
      }
      
      Console.WriteLine("=========================================");
      Console.WriteLine("=========================================");
      
      

      通過事件實現

      cat.cs

      public event Action ActionHanderEvent;   
      public void MiaoEvent()
      {
          Console.WriteLine($"{this.GetType().Name} MiaoEvent========");
          ActionHanderEvent.Invoke();   //這個行為要一定是執行 MiaoEvent方法的時候才觸發的;
      } 
      

      program.cs

       Console.WriteLine("事件的應用:============================");
       {
           Cat cat = new Cat();
           cat.ActionHanderEvent += new Baby().Cry;
           cat.ActionHanderEvent += new Mother().Wispher;
           cat.ActionHanderEvent += new Dog().Wang;
           cat.ActionHanderEvent += new Mouse().Run;
           cat.ActionHanderEvent += new Father().Roar;
           cat.ActionHanderEvent += new Neighbor().Awake;
           cat.ActionHanderEvent += new Stealer().Hide; 
           // cat.ActionHanderEvent -= new Baby().Cry;
           //cat.ActionHanderEvent.Invoke();
           cat.MiaoEvent ();
       }
      

      什么是事件,其實就是委托的實例+關鍵字; 事件是一個特殊的委托;
      委托和事件有什么區別?
      1 多個了關鍵字
      2 事件的權限控制會更加嚴格--事件的執行,只能,必須在聲明這個事件所在的類的內部才能執行;
      已經有了委托,為什么還要事件呢?----在系統框架設計中,需要這樣的權限控制;

      已經有了委托,為什么還要事件呢?----在系統框架設計中,需要這樣的權限控制;
      使用winform程序來做示范

      登錄
      思路:按鈕點擊會觸發這個方法,如果是通過事件來完成,必然會有一個地方定義得有事件,還要把這個方法給注冊到事件中去;
      執行的邏輯:在按鈕初始化的時候,把按鈕中的Click 指向一個方法btnLogin_Click;
      運行起來: 鼠標點擊按鈕----操作系統可以捕捉到鼠標的信號,通過句柄判斷,確定是哪個程序,通過程序中句柄判斷是按個一個組件(按鈕),可以獲取到按鈕的實例; 得到的是登錄按鈕; 鼠標單機左鍵信號,按鈕

      委托和事件的功能差不多---按鈕的點擊后觸發的行為,為什么用事件而不用委托?????
      就是為了要管控這個按鈕,只能在特定的情況下去執行;

      如果用委托:委托就可以在外部去執行;
      點擊登錄,觸發登錄的方法----必須是點擊登錄后觸發 所以只能用事件而不能用委托
      點擊注冊,觸發注冊的方法----必須是點擊注冊后觸發 所以只能用事件而不能用委托
      不能通過任何其他別的渠道來觸發這個方法
      如果我使用委托:盡管一在點擊了按鈕之后,可以觸發對應的行為,但是委托沒有權限的限制,就可以在外部執行這個委托----不允許的;保證動作觸發的來源一定是來自于哪里;

      委托和事件的相通性:
      二者功能差不多,觀察者;在程序中,除了保證代碼的問題;
      其他場景
      三個按鈕---鼠標指向---變顏色(按鈕的行為); 所有的按鈕都有這個行為; 而單單只有登錄和注冊--點擊后可以觸發對應的方法;因為給這兩個按鈕的Click事件注冊了行為;

      在系統的框架中,如果有一段邏輯的執行; 其中有一些通用的邏輯(三個按鈕都有執向變顏色),還有一些個性化的邏輯,每個按鈕點擊后可能需要執行不同的邏輯; 可以通過事件來進行注冊;

      價值: 可以把通用的邏輯封裝
      把可變的邏輯通過事件注冊

      執行來了,通用邏輯(統一的代碼執行)-----可變的邏輯(各自執行各自的~·) 程序可以更加靈活~~ Web--- ASP.NET MVC管道處理模型~~

      2.定義事件+實現發布訂閱

      1.朝夕要發布新課程,嵌入式和C++ Qt (都是Richard老師給大家上課)
      2.很多小伙伴們很期待,很關注
      3.如果課程發布,根據需求報名學習

       public class EventStandard
       { 
           private static PublicCourse publicCourse1 = new PublicCourse()
           {
               Id = 222,
               Name = "Qt和C++",
           }; 
           private static PublicCourse publicCourse2 = new PublicCourse()
           {
               Id = 222,
               Name = "嵌入式開發",
           };
            
           /// <summary>
           /// 發布課程
           /// </summary>
           public static void Show()
           {
               publicCourse1.PublicShow();// 只關注發布,發布后,會有后續的行為
               publicCourse2.PublicShow();
           }
      
           /// <summary>
           /// 初始化訂閱者和發布者之間的關系( 訂閱中心 )
           /// </summary>
           public static void Init()
           {
               StudentUser user1 = new StudentUser()
               {
                   Id = 123,
                   Name = "夕林吹雪"
               };
               publicCourse1.Publish += user1.Buy;
               publicCourse2.Publish += user1.Buy;
            
               StudentUser user2 = new StudentUser()
               {
                   Id = 123,
                   Name = "張三"
               };
               publicCourse1.Publish += user2.Buy;
               publicCourse2.Publish += user2.Buy;
      
      
               StudentUser user3 = new StudentUser()
               {
                   Id = 123,
                   Name = "李四"
               };
               publicCourse1.Publish += user3.Buy;
               publicCourse2.Publish += user3.Buy;
           }
      
       }
      
       /// <summary>
       /// 發布者
       /// 發布后,就會有后續的邏輯---具體是什么,不知道
       /// </summary>
       public class PublicCourse
       {
           public int Id { get; set; }
      
           public string Name { get; set; }
      
           public void PublicShow()
           {
               Console.WriteLine("朝夕新課程發布: Qt+C++  嵌入式開發~~~");
               //會有很多的人關注
               //會有很多的后續動作執行, 有人咨詢,有人報名,有人體驗課程~
      
               Publish.Invoke(this, new CourseInfo()
               {
                   Id=345,
                   Title="Qt和 C++"
               });
      
           }
           public event EventHandler Publish;
       }
      
      
       /// <summary>
       /// 訂閱者(訂戶):
       /// 訂閱消息,消息出現,就會觸發行為;
       /// </summary>
       public class StudentUser
       {
           public int Id { get; set; }
           public string Name { get; set; }
      
           public void Buy(object? sender, EventArgs e)
           {
               PublicCourse  course= (PublicCourse)(sender);
               Console.WriteLine($"朝夕有新的課程發布,可稱為{course.Name}");
               Console.WriteLine($"用戶:{Name}先了解下,考慮考慮");
               Console.WriteLine($"可以購買學習~~");
           }
      
       }
      
       /// <summary>
       /// 擴展參數
       /// </summary>
       public class CourseInfo : EventArgs
       {
           public int Id { get; set; }
           public string Title { get; set; }
           public string Description { get; set; }
           public string TeacherWechatNum { get; set; }
       }
      
      posted @ 2024-03-08 17:19  飄雨的河  閱讀(842)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 成在线人永久免费视频播放| 国产成人久久777777| 精品久久精品午夜精品久久| 国产在视频线在精品视频2020| 志丹县| 清纯唯美经典一区二区| 国产又爽又黄的激情视频| 人人爽人人爽人人爽| 日韩av一区二区高清不卡| 人妻精品动漫H无码中字| 少妇人妻真实偷人精品| 日韩 一区二区在线观看| 国产成AV人片在线观看天堂无码| 颍上县| 成人亚欧欧美激情在线观看| 熟女一区| 婷婷99视频精品全部在线观看| 亚洲午夜无码久久久久小说| 制服丝袜美腿一区二区| 亚洲a免费| 一区二区三区av天堂| 日本一区二区三区18岁| 国产又黄又硬又粗| 成人午夜污一区二区三区| 色噜噜噜亚洲男人的天堂| 精品国产熟女一区二区三区| 韩国午夜理伦三级| 天堂av资源在线免费| 新乡县| 2019亚洲午夜无码天堂| 性男女做视频观看网站| 99久久精品国产一区二区暴力| 漂亮的保姆hd完整版免费韩国| 亚洲2022国产成人精品无码区 | 国产成人一区二区三区免费| 国产人妻熟女呻吟在线观看| 性做久久久久久久| 亚洲精品成人片在线观看精品字幕| 国产熟睡乱子伦视频在线播放| 长白| 国产午夜精品理论大片|