觀察者模式(結合C#委託和事件)(行爲型)

        觀察者模式網上解釋得有很多,通常這樣解釋:觀察者模式(有時又被稱爲模型(Model)-視圖(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟件設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統。

        其實最常見的用觀察者模式的是一些訂閱消息之類的,類似自己選擇訂閱一個類型,然後系統會根據你選擇訂閱的類型來向你推送一些相關的信息。就比如當一個對象被修改的時候,會自動的通知與其關聯或是依賴的對象。

        最近在研究C#,發現C#中的委託和事件特別適合來講解觀察者模式這一概念,委託其實就是觀察者,它隨時注意着某種事件,當這個事件被觸發的時候,就會引起觀察者的注意,從而是觀察者行動起來。

         下面我們使用C#編寫一個例子來看看觀察者模式的使用,場景是這樣的,有老闆,然後又100個小老弟,每個小老弟每過1秒出來,老闆看見了,就說:“來了,xx老弟。”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;


namespace ObserverModelTest
{
	//聲明一個委託
    public delegate void MyEventHandler(int num);
    class Program
    {
        static void Main(string[] args)
        {
			Customer customer = new Customer();
			BoosEventHandler boos = new BoosEventHandler();
			//將NumChanged通過委託加載到事件上
			customer.NumChanged += new MyEventHandler(boos.Call);

			customer.Coming();

		}
    }

    //觀察者類
    class BoosEventHandler
    {
        public void Call(int num)
        {
            Console.WriteLine("來了,第"+ num +"個老弟!");
        }
    }

    

    //顧客類
    class Customer
    {
		//這裏定義一個NumChanged事件,event表示是事件,MyEventHandler表示將這個事件委託給了MyEventHandler
		public event MyEventHandler NumChanged;

        public Customer()
        {
			//此時等於null,表明沒有觀察者觀察,要關注的話,需要讓這個事件知道,即使用+=來操作
            NumChanged = null;
        }
		//顧客來了方法
        public void Coming()
        {
            for(int i = 1;i <= 100;i++)
            {
				//休眠1秒
				Thread.Sleep(1000);
				//NumEventArgs nEvent = new NumEventArgs(i);
				NumChanged(i);

			}
        }
    }

}

         代碼中已經有註釋說明了,這裏我再用白話來解釋一下:

         首先可以聲明一個委託,即MyEventHandler,然後我們建立我們的觀察者類,即BoosEventHandler。有了觀察者,我們需要被觀察者,於是建立顧客類,即Customer。顧客類裏面有個事件改變,即NumChanged,這個事件放在顧客來了方法裏面,即Coming,當顧客來了,就調用事件。接着我們看一下主函數,首先建立顧客對象,再建立觀察者對象,通過操作符“+=”將顧客改變事件加載到委託MyEventHandler上,此時便建立好了一套觀察者模式的結構,只需要顧客一來,便讓委託觸發觀察者,接着讓觀察者幹一些事,就好比“來了,老弟!”

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