zoukankan      html  css  js  c++  java
  • 事件总线 EventBus

    定义:

    事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。

    处理流程:

    事件 = 事件源  + 事件处理

     1.发布订阅模式案例

    案例GitLab地址:https://gitlab.com/yx06120910/consoleeventbus

    代码分析:

    1.列出鱼的枚举种类

        /// <summary>
        /// 枚举鱼的类型
        /// </summary>
        public enum FishType
        {
            鲫鱼,
            鲑鱼,
            和玉,
            黑鱼,
            鲈鱼,
            鱿鱼
        }
    View Code

    2.定义鱼竿模板

    声明钓鱼事件

        public class FishingRod
        {
            //声明委托
            public delegate void FishingHandler(FishType type);
            //声明事件
            public event FishingHandler FishingEvent;
    
            public void ThrowHook(FishingMan man)
            {
                Console.WriteLine("开始下钩了");
                var type = (FishType)new Random().Next(0, 5);
                Console.WriteLine("铃铛:叮叮叮,鱼儿咬钩了");
                if (FishingEvent != null)
                {
                    FishingEvent(type);
                    Console.WriteLine("本次钓鱼结束--------------------");
                }
            }
        }
    View Code

    3.定于钓鱼者模板

    (1)在模板内部调用鱼竿的钓鱼事件

    (2)定义两个订阅者

        //钓鱼者
        public class FishingMan
        {
            public string Name { get; set; }
    
            public int FishCount { get; set; }
            public FishingMan(string name)
            {
                Name = name;
            }
    
            public FishingRod FishingRod { get; set; }
    
            public void Fishing()
            {
                this.FishingRod.ThrowHook(this);
            }
    
            /// <summary>
            /// 订阅者1
            /// </summary>
            /// <param name="type"></param>
            public void Update(FishType type)
            {
                FishCount++;
                Console.WriteLine("{0}:调到第一条鱼【{2}】,已经调到{1}条鱼了", Name, FishCount, type);
            }
    
            /// <summary>
            /// 订阅者2
            /// </summary>
            /// <param name="type"></param>
            public void Log(FishType type)
            {
                Console.WriteLine("这是钓鱼日志:{0}", type);
            }
        }
    View Code

    4.执行钓鱼事件

        public class Fish
        {
            public void Fishing()
            {
                //初始化鱼竿
                var fishingRod = new FishingRod();
                //声明垂钓者
                var jeff = new FishingMan("小明");
                //分配鱼竿
                jeff.FishingRod = fishingRod;
                //注册观察者1
                fishingRod.FishingEvent += jeff.Update;
                //注册观察者2
                fishingRod.FishingEvent += jeff.Log;
                //循环钓鱼
                while (jeff.FishCount < 5)
                {
                    jeff.Fishing();
                    Console.WriteLine("--------------------");
                    //Thread.Sleep(5000);
                }
            }
        }
    View Code

    运行结果:

  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/yxcn/p/13613023.html
Copyright © 2011-2022 走看看