C#的publisher与subscriber,事件发布者与订阅者

说明:示例借鉴自这里,但原版很不友好,于是修改了下,一目了然。

直接上代码:

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

namespace _21_event_事件
{
    /*
     * 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。
     * 应用程序需要在事件发生时响应事件。例如,中断。
     * 事件是用于进程间通信。
     * 
     * 包含事件的类用于发布事件。这被称为 发布器(publisher) 类。
     * 其他接受该事件的类被称为 订阅器(subscriber) 类。
     * 事件使用 发布-订阅(publisher-subscriber) 模型。
     */
    class Program
    {
        static void Main(string[] args)
        {
            ChangeNumEventPublisher e = new ChangeNumEventPublisher();

            Console.WriteLine("订阅之前");
            e.SetValue(7);
            e.SetValue(11);

            ChangeNumEventSubscriberA a1 = new ChangeNumEventSubscriberA();
            ChangeNumEventSubscriberB b1 = new ChangeNumEventSubscriberB();
            ChangeNumEventSubscriberA a2 = new ChangeNumEventSubscriberA();
            ChangeNumEventSubscriberB b2 = new ChangeNumEventSubscriberB();

            //订阅事件 -- 思考下静态事件与非普通事件的区别
            e.ChangeNumEvent += a1.NumManipulationHandler;
            e.ChangeNumEvent += a2.NumManipulationHandler;
            e.ChangeNumEvent += b1.NumManipulationHandler;
            e.ChangeNumEvent += b2.NumManipulationHandler;

            Console.WriteLine("订阅之后");
            e.SetValue(12);
            e.SetValue(17);


            Console.ReadKey();
        }
    }

    /// <summary>
    /// 包含事件的类,用于发布事件。
    /// </summary>
    public class ChangeNumEventPublisher
    {
        private int value;

        public delegate void NumManipulationHandler(int num); //委托
        public event NumManipulationHandler ChangeNumEvent; //事件(我更愿意叫它事件通知的注册中心),注意静态与否的影响

        protected virtual void OnNumChanged()
        {
            if (ChangeNumEvent != null) //判断是否有订阅者
            {
                Console.WriteLine("有事件发生了,有订阅者,开始通知订阅者");
                ChangeNumEvent(value); //有订阅者就发布事件
            }
            else
            {
                Console.WriteLine("有事件发生了,但没有订阅者");
            }

        }

        public void SetValue(int n)
        {
            if (value != n) //只有值改变的时候才会出发事件
            {
                value = n;
                OnNumChanged();
            }
        }
    }

    /// <summary>
    /// 事件订阅者
    /// </summary>
    class ChangeNumEventSubscriberA
    {
        public void NumManipulationHandler(int val)
        {
            Console.WriteLine("我是ChangeNumEventSubscriberA,是你如约召唤我。val=" + val);
        }
    }
    /// <summary>
    /// 事件订阅者
    /// </summary>
    class ChangeNumEventSubscriberB
    {
        public void NumManipulationHandler(int val)
        {
            Console.WriteLine("我是ChangeNumEventSubscriberB,是你如约召唤我。val=" + val);
        }
    }
}

posted on 2017-05-10 11:15  LarryZeal  阅读(805)  评论(0编辑  收藏  举报

导航