C#基礎 概念之委託,事件(面試:貓叫了,老鼠跑了主人醒了 )其二:封裝

.net 委託,事件(面試:貓叫了,老鼠跑了主人醒了 )其一
.net 委託,事件(面試:貓叫了,老鼠跑了主人醒了 )其二
.net 委託,事件(面試:貓叫了,老鼠跑了主人醒了 )其三
源代碼

事件

事件基於委託,爲委託提供了一種發佈/訂閱機制(觀察者模式)
事件必須包含三部分:
事件的訂閱者
事件的觸發者/發佈者
訂閱者和觸發者之間的數據傳輸通道

事件(event)的本質:事件本身其實就是一個委託鏈

事件與委託鏈的異同:

相同

  1. 事件的本質就是委託鏈,可以進行委託鏈的增加和移除

不同

  1. 事件本身時私有的,只能通過+=和-=訪問
  2. 委託鏈可以隨時進行增加和刪除,也可以隨時進行賦值(此爲委託鏈的弊端:委託隨時可以被篡改)
  3. 事件只能增加相同標籤的動作,但是委託鏈可以增加不同標籤的動作

問題:貓叫了一聲,老鼠們跑了,主人醒了

事件二探:封裝

核心:事件應該由事件的發佈者觸發

訂閱者:
用於在事件觸發後,做出對應的響應行爲
此處傳入的ifCatMiao就是事件的結果,WakeUp就是響應行爲

    /// <summary>
    /// 訂閱者 老鼠
    /// </summary>
    public class Master
    {
        public void WakeUp(bool ifCatMiao)
        {
            System.Diagnostics.Debug.WriteLine("主人醒了");
        }
    }

    /// <summary>
    /// 訂閱者 主人
    /// </summary>
    public class Mouse
    {
        public void RunAway(bool ifCatMiao)
        {
            System.Diagnostics.Debug.WriteLine("老鼠跑");
        }
    }

發佈者
此處發佈者封裝了事件的觸發

    /// <summary>
    /// 發佈者貓,把事件放在發佈者貓內部,並提供執行語句
    /// 重要:事件應該由事件的發佈者觸發
    /// </summary>
    public class Cat2
    {
        public delegate void IfMiaoHandler(bool bol);

        public static event IfMiaoHandler IfMiao;


        public static bool Miao()
        {
            //var ifMiao = (new Random()).Next(0, 1)==1;
            //if (ifMiao)
            //{
            //    System.Diagnostics.Debug.WriteLine("貓叫了");
            //}else
            //{
            //    System.Diagnostics.Debug.WriteLine("貓睡着了");
            //}
            System.Diagnostics.Debug.WriteLine("貓叫了");
            return true;
        }
        public static void Excute(bool bol)
        {
            //事件在對象之內
            IfMiao(bol);
        }
    }

管道:

        public void Second()
        {
            var mouses = new List<Mouse>() { new Mouse(), new Mouse(), new Mouse() };

            var master = new Master();

            //添加老鼠的逃跑
            foreach (var mouse in mouses)
            {
                Cat2.IfMiao += mouse.RunAway;
            }

            //添加主任的驚醒
            Cat2.IfMiao += master.WakeUp;

            //直接激發事件或報錯,在事件所處的對象之外,事件只能出現在+=,-=之外
            //Cat2.IfMiao(Cat2.Miao());
            Cat2.Excute(Cat2.Miao());
        }

此處的主要作用是實現了:
事件應該由事件的發佈者觸發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章