关于as中的事件与回调函数

  对于Observer模式, 在as中object(被观察者)既可以用事件(event),也可以用回调函数(caller)来通知观察者(observer)。那在实际的开发中到底应该选择用event还是用caller呢?在回答这个问题之前,让我们首先分析一下两者的特点。

  对于event模式, 自身是基于as系统本身的事件机制(IEventDispatcher)。object在数据更新时, 无需做其他处理, 只管调用系统的dispatchEvent接口发送event即可。而observer要根据实际情况利用IEventDispatcher提供的接口进行注册监听和移除监听。但是observer收到event通知时,需要先判断这个event是不是自身需要的数据更新时object派发的, 再决定是否处理这个event。所以对于这种模式, object只需要负责发送事件, 而不需要管理observer的注册和管理问题,因此object的代码只需要负责自身的逻辑。这种模式较为灵活和方便。

  对于caller模式, 需要object自身对observer的注册和移除进行管理, 这样导致了object需要关注自身逻辑之外的代码。object在数据更新时,需要根据更新的数据找到对应的caller进行回调, observer此时就无需做多余的判断。

  举个实际的例子, 对于一个资源加载器ResourceMgr,如果其提供一个function load(url, ...): void这样的接口,那么在资源加载完之后他是应该使用event还是使用caller通知对应的observer来处理资源呢?由于有很多observer会利用ResourceMgr进行加载资源, 如果是event模式,那么每个observer都会收到event, 然后在判断是不是自己的资源, 这样效率很低。 很明显这里应该用caller进行通知。

  总结之, 如果一个object对应的潜在observer数量庞大, 这时就应该使用caller模式;相反, 如果一个object只会对应一个或者几个特定的observer,这时应该使用event模式。

原文地址:https://www.cnblogs.com/zilongblog/p/3231728.html