C#中的事件的訂閱與發布


認識發布者/訂閱者模式

發布者定義一系列事件,並提供一個注冊方法;

訂閱者發布者注冊自己的事件處理邏輯,供一個可被回調的方法,也就是事件處理程序;當發布者的事件被觸發的時候,訂閱者將通過回調函數得到發布者通知,而訂閱者所注冊的回調函數,也就是事件處理邏輯的所有方法都會被執行

  • 發布者是指擁有某事件的類或者結構
  • 訂閱者是指向發布者注冊的類或者結構
  • 事件處理程序是指由訂閱者注冊到事件的方法,在發布者觸發事件時執行

 參考:https://blog.csdn.net/weixin_38486884/article/details/82853508

從一個簡單的例子,來說明一下這種事件消息傳遞的機制! 

      有一家三口,媽媽負責做飯,爸爸和孩子負責吃。。。將這三個人,想象成三個類。

      媽媽有一個方法,叫做“做飯”。有一個事件,叫做“開飯”。做完飯后,調用開飯事件,發布開飯消息。

      爸爸和孩子分別有一個方法,叫做“吃飯”。

      將爸爸和孩子的“吃飯”方法,注冊到媽媽的“開飯”事件。也就是,訂閱媽媽的開飯消息。讓媽媽做完飯開飯時,發布吃飯消息時,告訴爸爸和孩子一聲。

 

這種機制就是C#中的,訂閱發布。下面我們用代碼實現:

class Program
    {
        public static void Main(string[] args)
        {
            //實例化對象
            Mom mom = new Mom();
            Dad dad = new Dad();
            Child child = new Child();
            
            //將爸爸和孩子的Eat方法注冊到媽媽的Eat事件
            //訂閱媽媽開飯的消息
            mom.Eat += dad.Eat;
            mom.Eat += child.Eat;
            
            //調用媽媽的Cook事件
            mom.Cook();
            
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
    
    public class Mom
    {
        //定義Eat事件,用於發布吃飯消息
        public event Action Eat;
        
        public void Cook()
        {
            Console.WriteLine("媽媽 : 飯好了");
            //飯好了,發布吃飯消息
            Eat?.Invoke();
        }
    }
    
    public class Dad
    {
        public void Eat()
        {
            //爸爸去吃飯
            Console.WriteLine("爸爸 : 吃飯了。");
        }
    }
    
    public class Child
    {
        public void Eat()
        {
            //熊孩子LOL呢,打完再吃
            Console.WriteLine("孩子 : 打完這局再吃。");
        }
    }

 

運行結果:

 

當爺爺奶奶來做客了怎么辦呢?和爸爸孩子一樣,寫個Eat方法,同樣注冊到媽媽的開飯事件就好了。

 

出處:https://www.cnblogs.com/David-Huang/p/5150671.html

====


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM