定义:
事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。
处理流程:
事件 = 事件源 + 事件处理
1.发布订阅模式案例
案例GitLab地址:https://gitlab.com/yx06120910/consoleeventbus
代码分析:
1.列出鱼的枚举种类
/// <summary> /// 枚举鱼的类型 /// </summary> public enum FishType { 鲫鱼, 鲑鱼, 和玉, 黑鱼, 鲈鱼, 鱿鱼 }
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("本次钓鱼结束--------------------"); } } }
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); } }
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); } } }
运行结果: