• 事件总线 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

    运行结果:

  • 相关阅读:
    网络多线程 ---实现网络负载图片
    optimizer for eclipse--Eclipse优化,让你的Eclipse快来飞!
    ORACLE AUTOMATIC STORAGE MANAGEMENT翻译-第二章 ASM instance(1)
    IOS 开展 分别制定了iphone 和 ipad 好? 或开发一个 Universal好?
    DevExpress VCL 2014.1.2 for C++BUILDER XE6
    swift http请求返回json数据和分析
    Spark里面的任务调度:离SparkContext开始
    ftk学习记录(一个进度条文章)
    Appium Android Bootstrap控制源代码的分析AndroidElement
    别忽视了业绩比较基准
  • 原文地址:https://www.cnblogs.com/yxcn/p/13613023.html
Copyright © 2020-2023  润新知