1. 程式人生 > >C#設計模式-觀察者模式與事件的一點小小心得

C#設計模式-觀察者模式與事件的一點小小心得

由於經驗和能力有限,設計模式這種高大上的東西要研究下來,不知道要禿了多少根頭髮,作為一個初學者,也只能簡單的理解一下大概思路

最近剛好在惡補基礎,看到了事件event  看大佬的部落格和資料一大串,幾百行 還沒看已經暈掉了

只能先簡化一下,說一下自己的理解

事件 Event 

通過大佬的資料,事件可以理解為一個特殊的多播委託

宣告一個委託就像宣告一個類 ,但是比類的宣告多了引數型別和返回方法   如 delegate void Mydelegate();

這個委託宣告的型別指定了可以被這個委託變數呼叫的方法的引數型別和返回型別

正常情況下要想使用委託,就要定義一個委託型別的

變數或者說一個委託型別的物件來使用

Mydelegate hander;

事件event 就是在這個基礎上 加上event 關鍵字

Event  Mydelegate hander;

事件和委託在宣告的時候必須在類中宣告,方法中不行

話不多說,說一下本人對這個觀察者模式的理解:

既然存在觀察者,那麼一定有一個被觀察者,被觀察者做了什麼舉動會立馬被觀察者察覺到,然後做出對應的舉動。

舉個通俗的貓和老鼠的例子:老鼠是觀察者,貓是被觀察者 當貓來了以後,老鼠會立馬知道,然後逃跑。

這裡面用事件或者委託都可以;

上程式碼:

貓的類

using System;


namespace Event_Watch { /// <summary> /// 貓-被觀察者 /// </summary> public class Cat { public Cat(string name,int age) { Name = name; Age = age; } public delegate void Myhander(); public event Myhander CatEvent;//事件 public
string Name { get; set; } public int Age { get; set; } /// <summary> /// 當被觀察者發生變化時,就要通知觀察者 /// </summary> public void CatComing() { Console.WriteLine("有一隻{0}歲貓{1}進來了",Age,Name); if (CatEvent != null) { CatEvent(); } } } }

 

老鼠的類

using System;


namespace Event_Watch
{
    /// <summary>
    /// 老鼠-觀察者
    /// </summary>
    public class Mouse
    {
        /// <summary>
        /// 老鼠看到貓了,就要開始跑了
        /// </summary>
        /// <param name="name"></param>
        /// <param name="cat"></param>
        public Mouse(string name,Cat cat)
        {
            Name = name;
            cat.CatEvent += Run;//觀察者開始關注被觀察者的一舉一動


        }
        public string Name { get; set; }

        /// <summary>
        /// 觀察者的行為
        /// </summary>
        public void Run()
        {
            Console.WriteLine("{0}老鼠快跑",Name);
        }
    }
}

 

如何用呢

using System;

namespace Event_Watch
{
    class Program
    {
        
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Cat cat = new Cat("藍胖子", 1);

            Mouse mouse = new Mouse("",cat);
            Mouse mouse2 = new Mouse("", cat);
            cat.CatComing();
        }
    }
}

這裡建立老鼠物件的傳入貓的例項物件,表示為老鼠看到貓了

一個簡單的例子就是這樣了