回顾
管道-过滤器
- 构件:过滤器、处理数据流
- 连接件:管道
- 拓扑结构:
应用:线性管道-过滤器风格到KWIC
- 4个过滤器:输入、移位、排序、输出
- 每个过滤器处理数据,将结果送到下一个过滤器
- 控制机制:分布式,只要有数据传入,过滤器就开始工作
- 过滤器之间的数据共享被严格限制
- 没有master来作为总程序进行控制,每个过滤器都是独立的
- 不同的对象之间没有直接耦合
2.5 事件系统风格
- 显示调用
- 各个构件之间的互动是显式的由调用函数或过程完成的
- 调用的过程与次序是固定的
- 隐式调用
- Event Source 事件源 广播一些事件
- Event Handlers 其他构件可以注册自己感兴趣的事件,并将自己的某个过程与相应的事件关联
- Event Manger 当一个事件被发布,系统自动调用在该事件上注册的所有过程
特点
事件的触发者不知道哪些构件会被这些事件影响,相互独立
基本构件
构件:对象或过程,并提供两种接口:
- 一组过程/函数,充当事件源或处理器
- 事件
连接件:事件-过程绑定
- 事件处理器
- 事件源构成发布事件
- 某些事件被发布时,向其注册过的过程被隐式调用
- 调用的次序是不定的
注:连接件也可以是事件-事件绑定
调试器例子
-
EventSource : debugger
-
EventHandler: editor and variable monitor
-
EventManager: IDE
-
编辑器与变量监视器向调试器注册,接收“断点事件”
-
一旦遇到断电,调试器发布事件,触发“编辑器”与“变量监测”
事件调度策略
- 非集中式(无独立的)调度模块的事件管理器(即:分布式的)
- 带有独立调度模块的
无独立模块的
Observable/Observer
]
事件调度模块?
- 全广播:将事件广播到所有模块,只有感兴趣的才触发行为
- 选择广播:只讲事件发送到注册了的模块中
选择广播的两个策略
- 点对点(基于消息队列)
- 只能被一个人处理
- 发布-订阅模式
- 订阅者向“主题”订阅事件——一个事件可以被多个订阅者消费
- 事件在发送给订阅者后,并不会马上从topic中删除,topic会在事件过期之后自动删除
KWIC案例:事件驱动风格
特点
- 支持实现交互式系统(用户输入/网络通信)
- 异步执行
- 软件复用强大支持——解耦
- 当需要将一个构件加入现存的系统中时,只需要将它注册到系统的事件中
- 系统动态演化
- 事件并发处理
- 健壮性:一个构件出错了不会影响其他构件
缺点
- 使系统的同步、验证、调试比较困难
- 传统的基于先验和后验变得不可能
- 数据交换:存在调度,带来性能问题
评论区