• 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);
            }
        }
    }
  • 相关阅读:
    String驻留带来的危害
    Go语言的堆栈分析
    SecureCRT使用技巧
    Javascript中相同Function使用多个名称
    记录Office Add-in开发经验
    Silverlight和WPF中DataContractJsonSerializer对时间的处理差异
    ASP.NET MVC项目实践技巧
    有点担心Node.js的未来了
    回首经典的SQL Server 2005
    duilib关于学习Demo中的QQ
  • 原文地址:https://www.cnblogs.com/larryzeal/p/6834957.html
Copyright © 2020-2023  润新知