原文:Design Patterns: Event Bus

Motivation

想象一下,有一个包含大量相互交互的组件的大型应用程序,并且您想要一种方法使您的组件进行通信,同时保持松散耦合和关注点分离原则,事件总线模式可以很好地解决您的问题。

事件总线的想法实际上与网络(总线拓扑)中研究的总线非常相似。 你有某种管道和连接到它的计算机,每当其中一个发送消息时,它就会被分派给所有其他人。 然后,他们决定是要使用给定的消息还是只是丢弃它。

在组件级别,它非常相似:计算机是您的应用程序组件,消息是您要通信的事件或数据,管道是您的 EventBus 对象。

下面是一种经典的实现方式,因为它依赖于定义您的 EventBus 接口(强制给定的合约),以您想要的方式实现它,并定义一个 Subscribable(另一个合约)来处理 Event(和另一个合约)消费。

定义一个事件接口:

/*** interface describing a generic event, and it's associated meta data, it's this what's going to* get sent in the bus to be dispatched to intrested Subscribers*/
public interface Event<T> {/*** @returns the stored data associated with the event*/T getData();
}

定义事件的监听者即事件消费者:

import java.util.Set;/*** Description of a generic subscriber*/
public interface Subscribable {/*** Consume the events dispatched by the bus, events passed as parameter are can only be of type* declared by the supports() Set*/void handle(Event<?> event);/*** describes the set of classes the subscribable object intends to handle*/Set<Class<?>> supports();
}

事件总线的实现:

import java.util.List;/*** Description of the contract of a generic EventBus implementation, the library contains two main* version, Sync and Async event bus implementations, if you want to provide your own implementation* and stay compliant with the components of the library just implement this contract*/
public interface EventBus {/*** registers a new subscribable to this EventBus instance*/void register(Subscribable subscribable);/*** send the given event in this EventBus implementation to be consumed by interested subscribers*/void dispatch(Event<?> event);/*** get the list of all the subscribers associated with this EventBus instance*/List<Subscribable> getSubscribers();
}

Subscribable 通过定义 supports 方法声明了一种方法来处理给定类型的对象以及它支持的对象类型。

EventBus 实现持有所有 Subscribables 的列表,并在每次有新事件进入 EventBusdispatch 方法时通知所有订阅者。

选择此解决方案可为您提供编译时间来检查传递的 Subscribables,而且,这是一种更面向对象的方式,不需要反射魔法,而且如您所见,它很容易实现。 缺点是契约强制的事情——你总是需要一个新的类来处理一种类型的事件,一开始这可能不是问题,但随着你的项目的增长,你会发现创建一个有点重复 类只是处理简单的逻辑,例如日志记录或统计信息。

Event Bus 设计模式学习笔记相关推荐

  1. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  2. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  3. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  4. 36设计模式学习笔记

    设计模式学习笔记 文章目录 0.设计模式简介 1.单例模式 2.工厂方法 3.抽象工厂 4.责任链模式 5.模板方法 ok 一.模板方法简介 二.模式的定义和特点 三.模式的结构和实现 四.什么是模板 ...

  5. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  6. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  7. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  8. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  9. 设计模式学习笔记--Strategy 策略模式

    所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...

最新文章

  1. 展望:模型驱动的深度学习
  2. 《设计模式之禅》学习笔记(一)
  3. @property 各个属性作用【使用时最需注意strong/weak类型】【补充部分内存知识】...
  4. ASP获取数据库表名,字段名以及对字段的一些操作
  5. DateTime::diff
  6. arcgis里面怎么截图_ArcGIS在变更调查中影像截图批量制作的统一方法
  7. Java有关数组例题_Java基础——数组例题二维数组
  8. android卡机字符串,Android调用replace方法正则表达式卡死
  9. 怎样安装计算机病毒,台式机电脑中病毒如何重装系统图文教程
  10. 16个精美的 HTML5 作品集网站设计案例
  11. 印象笔记中可以使用html语言吗,印象笔记支持markdown啦
  12. java调用海康人脸识别机5603的sdk的使用总结(一)
  13. [kubernetes]-kubernetes+nfs创建高可用mysql
  14. 985大学计算机专业高考录取分数线,985大学历年录取分数线
  15. 小米发布会的米8探索者——很吓人的技术分析
  16. [953]mongo创建索引及索引相关方法
  17. 统计奇偶个数c语言程序,C语言编程给定N个正整数,统计奇数和偶数的个数
  18. 伪原创文章写作格式(符合seo优化的文章规范是什么)
  19. Mac配置LNMP开发环境全记录 一看就懂系列
  20. Linux快捷键大全(参考)

热门文章

  1. 涂鸦之作WanAndroid第三方APP
  2. HTML基础第四讲---图像
  3. 为甚么 国企做互联网总做不起来?
  4. Cocos2d-x编程中CCRemoveSelf与CCCallFunc系列函数不能一起使用
  5. 在ExtJS的ComboBox组件中实现下拉树效果
  6. 把windows窗口编程浅绿色的方法
  7. C++中如何去掉std::string对象的首尾空格
  8. springboot配置mybatis
  9. AS3 --调用Js
  10. C#进阶系列——使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)...