观察者模式(结合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上,此时便建立好了一套观察者模式的结构,只需要顾客一来,便让委托触发观察者,接着让观察者干一些事,就好比“来了,老弟!”

发布了165 篇原创文章 · 获赞 41 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_41061437/article/details/97383307