事件/消息派发器

本文探讨了项目中事件/消息派发的常见需求,通过全局事件管理和消息冒泡两种方式实现。全局事件管理器采用观察者模式,但可能导致不必要的多个回调。为解决此问题,借鉴AS3的消息冒泡机制,实现指定目标的消息派发,适用于单一侦听者并需要精确派发的场景。
摘要由CSDN通过智能技术生成

项目工程中经常使用事件/消息派发以及消息回调机制,最近在工作中我遇到了事件派发器的一点小问题在此记录以备之后再次使用。


一. 事件派发器需求:  

A类为一个数据功能集合 其包含很多属性 A.a A.b A.c,每个属性又包含很多子属性 依次。。  要求任意属性或者其子属性发生变化时刷新/调用B类一个回调方法。


二. 实现方式一 --------------------------全局消息/事件管理器


采用观察者模式实现一个全局事件管理器。

1. 观察者模式基本原理: 所谓观察者模式也就是某一主题保存所有关心此主题的所有观察者信息 ,当主题出现时通知所有观察者。

   

         当各种属性发生变化时所需要做出反应的类作为一个观察者/侦听者  在所有属性发生变化时派发消息事件从而完成对属性变化消息的侦听。


注: 简单的全局消息派发存在一个缺陷即侦听者/观察者一旦被注册将会无条件执行消息回调,例如有两个B类的对象b1 b2都注册了事件回调,当a1属性变化时会抛出事件此时b1 b2均响应回调而我们此时可能只想b1对象响应。(当然此问题可以通过增加优先级 增加定向消息派发等机制解决 但无疑会增加其复杂性)


三. 实现方式二 --------------------------消息冒泡

为了解决全局消息派发不能指定侦听对象这一缺陷,我借鉴AS3消息冒泡机制实现这一消息向上传递的需求。

冒泡机制:

as3的事件过程包括三个阶段 捕获,目标和冒泡阶段。下面我举一个很简单的例子来说明冒泡机制。舞台stage上有一个元件mc,mc上有一个子按钮元件btn.



捕获阶段:鼠标在btn上发出点击事件。首先捕获该事件的是stage,然后向下传递到mc,再到btn
目标阶段:找到鼠标的最底层的目标btn,如果它注册了监听函数,就执行该监听函数了
冒泡阶段:开始冒泡,自底向上。从btn到mc,最后到stage

 也就是说当点击事件触发时btn会先捕获此事件 处理后向上层的mc派发 之后再向stage派发


类似的我将A的各个属性及每个属性的子属性作为(stage -- mc -- btn)任何属性变化时都会向上冒泡 在A类中提供注册冒泡消息回调的方法(调用B类的事件触发),这样就可以保证指定目标的消息派发。


注: 此种方式只针对侦听者只有一个且要区分指定目标的消息派发时较为好用,与全局消息派发互补.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值