zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
  • 相关阅读:
    BZOJ4416 SHOI2013阶乘字符串(状压dp)
    雅礼集训 Day2 T3 联盟 解题报告
    雅礼集训 Day1 T2 折射
    雅礼集训 Day1 T1 养花
    P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
    洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告
    动态MST
    洛谷 P2606 [ZJOI2010]排列计数 解题报告
    牛客 2018NOIP 模你赛2 T2 分糖果 解题报告
    洛谷 P3396 哈希冲突 解题报告
  • 原文地址:https://www.cnblogs.com/larryzeal/p/6834957.html
Copyright © 2011-2022 走看看