代码改变世界

事件总线 EventBus

2020-09-04 11:53  石吴玉  阅读(245)  评论(0编辑  收藏  举报

定义:

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

处理流程:

事件 = 事件源  + 事件处理

 

 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

运行结果: