用于模块间解耦,通过发布订阅的方式调用,每个人只负责自己的那部分。

写个小例子,比如现在有三个模块,订单、购物车、优惠券,由不同的人负责开发。

负责订单模块的人现在需要写个生成订单的方法,生成订单的逻辑包括删除购物车项、标记优惠券已使用。

如果直接调用购物车、优惠券两个模块中的方法,耦合性高。

此时可以使用EventBus进行解耦。

 public class EventBus
     {
         private EventBus() { }
         private static Object syncObj = new object();
         private static EventBus _instance = null;
         public static EventBus Instance
         {
             get
             {
                 if (_instance == null)
                 {
                     lock (syncObj)
                     {
                         if (_instance == null)
                         {
                             _instance = new EventBus();
                         }
                     }
                 }
                 return _instance;
             }
         }

         private ConcurrentDictionary<string, List<Action<object[]>>> _dict = new ConcurrentDictionary<string, List<Action<object[]>>>();

         private bool ExistEvent(string eventName)
         {
             if (_dict.ContainsKey(eventName))
             {
                 return true;
             }
             return false;
         }
         public void InvokeEvent(string eventName,object[] args)
         {
             if (!this.ExistEvent(eventName))
             {
                 return;
             }
             foreach (var eventHandler in this._dict[eventName])
             {
                 eventHandler.Invoke(args);
             }
         }
         public void AddEvent(string eventName, Action<object[]> eventHandler)
         {
             if (this.ExistEvent(eventName))
             {
                 this._dict[eventName].Add(eventHandler);
             }
             else {
                 this._dict[eventName] = new List<Action<object[]>> { eventHandler };
             }
         }
         public void AddEvent(string eventName, List<Action<object[]>> eventHandlerList)
         {
             if (this.ExistEvent(eventName))
             {
                 this._dict[eventName].AddRange(eventHandlerList);
             }
             else
             {
                 this._dict[eventName] = eventHandlerList;
             }
         }
         public void RemoveEvent(string eventName)
         {
             if (this.ExistEvent(eventName))
             {
                 this._dict.TryRemove(eventName,out var value);
             }
         }
         public void RemoveEvent(string eventName, Action<object[]> eventHandler)
         {
             if (this.ExistEvent(eventName))
             {
                 this._dict[eventName].Remove(eventHandler);
             }
         }

     }
     public class ShopCartService
     {
         /// <summary>
         /// 删除购物车
         /// </summary>
         /// <param name="shopCartID"></param>
         public void RemoveShopCart(int orderID)
         {
             Console.WriteLine($"已删除订单{orderID}的购物车项");
         }
     }
     public class CouponService
     {
         /// <summary>
         /// 标记优惠券已使用
         /// </summary>
         public void RecordUsedCoupon(int orderID)
         {
             Console.WriteLine($"已将订单{orderID}标记已使用优惠券");
         }
     }
     public class OrderService
     {
         /// <summary>
         /// 创建订单
         /// </summary>
         public void CreateOrder()
         {
             ;
             Console.WriteLine($"生成订单");
             EventBus.Instance.InvokeEvent(EventNames.CREATEORDER_EVENT, new object[] { orderID });
         }
     }
    public static class EventNames
    {
        public static string CREATEORDER_EVENT = "CreateOrder";
    }

---------------------------------------------------------------------------

订阅、发布

  static void Main(string[] args)
         {
             //订阅
             EventBus.Instance.AddEvent(EventNames.CREATEORDER_EVENT, new List<Action<object[]>>
             {
                (args)=>{ ].ToString())); },
                (args)=>{ ].ToString())); }
             });

             var orderService = new OrderService();
             orderService.CreateOrder();

         }

使用EventBus对模块解耦(附实例)的更多相关文章

  1. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

  2. Java设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J设计模式之五大创建型 ...

  3. (转)Java经典设计模式(3):十一种行为型模式(附实例和详解)

    原文出处: 小宝鸽 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J ...

  4. Linux chmod命令修改文件与文件夹权限的命令附实例

    Linux chmod命令修改文件与文件夹权限的命令附实例 作者:佚名 字体:[增加 减小] 来源:互联网 时间:05-01 20:46:07我要评论 在linux中要修改一个文件夹或文件的权限我们需 ...

  5. Java经典设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  6. Java设计模式之七大结构型模式(附实例和详解)

    博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...

  7. (转)Java经典设计模式(2):七大结构型模式(附实例和详解)

    原文出处: 小宝鸽 总体来说设计模式分为三大类:创建型模式.结构型模式和行为型模式. 博主的上一篇文章已经提到过创建型模式,此外该文章还有设计模式概况和设计模式的六大原则.设计模式的六大原则是设计模式 ...

  8. web自动化测试-模块驱动测试实例和数据驱动测试实例

    一.模块驱动测试实例 把登录和退出统一封装在login类中,若把login类单独放在一个文件中,就可以给任一测试脚本调用,这里就跟测试脚本放一起 from selenium import webdri ...

  9. Python命令行参数解析模块getopt使用实例

    Python命令行参数解析模块getopt使用实例 这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参 ...

随机推荐

  1. 【沙龙报名中】与微信&云开发官方团队零距离互动,揭秘爆款微信小游戏背后的技术!

    有人说 微信小程序游戏的百花齐放 活像十几年前的4399小游戏称霸互联网的景象 " 歪,斗地主吗,三缺二, 不用下app,小程序就能玩,我保证不抢地主让你抢!" ...... &q ...

  2. (十四)golang--函数和包

    1.怎么定义函数? func (形参列表) 返回值列表{ 执行操作 return } 2.什么是包? 包的本质就是一个文件夹,存放程序文件 三大作用: 区分相同的名字的函数.变量等标识符: 当程序文件 ...

  3. 基于opencv+python的二维码识别

    花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...

  4. eclipse使用maven,启动工程tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.Contex

    maven是个不错的管理jar包工具,但是我们在eclipse使用maven时,总是遇上这样那样的问题,比如今天,我编译工程,启动过后,tomcat报错:java.lang.ClassNotFound ...

  5. sqlserver之datepart和datediff应用查找当天上午和下午的数据

    DATEPART() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. DATEDIFF() 函数返回两个日期之间的时间差. --查找当天上午的数据 ) --查找当天下午的数据 ) ...

  6. windows配置flutter的注意点

    参考官网配置:https://flutter.cn/docs/get-started/install/windows 注意点: 1. 配置好环境变量后,必须重启电脑才有效果(后面还有需要重启的,所以到 ...

  7. rabbitMQ基础应用

    1.安装erlang [root@localhost ~]#yum -y install erlang 2.安装rabbitMQ [root@localhost ~]#yum -y install r ...

  8. drf--版本控制

    目录 作用 内置版本控制 局部使用 全局使用 案例 源码分析 作用 因为程序在不停的更新迭代,新版和旧版差别比较大,但此时有些用户没用进行更新,还是访问的旧版,此时就需要进行版本控制,让用户体验更好 ...

  9. cs1.6 8倍镜

    地图名字包含awp的是狙击场 打开游戏 搜索方法 开镜搜减小,关镜搜增加 分析数据 开关镜,观察数据变动 修改测试 测试结果 类似的:鼠标XY坐标,也是上减下加,左加右减

  10. 七月伊始 LeetCode算法总结

    七月伊始 早上买了LeetCode的课程,解锁了付费题目,付费倒逼学习: 意识到这么久学习的东西,都是写在自己的笔记, 如今希望自己能够用自己拙笔记录这个学习和总结的过程. 队列的学习 设计循环队列 ...