【发布时间】:2011-01-14 02:11:49
【问题描述】:
我正在讨论解决一个非常典型的问题的两种方法:知道事件何时发生或在事件已经发生时立即响应。
在方法一中,MyLoader1 的用户添加了一个事件监听器,如果加载器已经完成,它将立即触发。
class MyLoader1 extends EventDispatcher
{
private var _isComplete:Boolean = false;
public override function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
{
super.addEventListener(type, listener, useCapture, priority, useWeakReference);
// if the operation is already complete, immediately notify listeners
if(_isComplete)
{
dispatchEvent(new Event(Event.COMPLETE));
}
}
}
class Application1()
{
function main():void
{
new MyLoader1().addEventListener(Event.COMPLETE, onComplete);
}
}
在方法 2 中,MyLoader2 的用户必须先检查 MyLoader2 的完成状态,然后再决定是否继续或添加稍后触发的侦听器。
class MyLoader2 extends EventDispatcher
{
private var _isComplete:Boolean = false;
public function get isComplete():void
{
return _isComplete;
}
}
class Application2()
{
function main():void
{
var loader:MyLoader2 = new MyLoader2();
if(loader.isComplete)
{
// passing null just to simplify the example
onComplete(null);
}
else
{
loader.addEventListener(Event.COMPLETE, onComplete);
}
}
}
每种方法有哪些优点/缺点?是否有我可以/应该用于这种情况的设计模式?
我倾向于第一个,因为它需要较少的 Loader 类知识和较少的代码来利用它。但是,当有多个侦听器时,它可能会产生不必要的副作用,因为每次添加侦听器时该事件都会触发一次。
第二种方法可以理解,也更容易调试,但需要更多的前期工作,并且似乎破坏了 Loader 的封装。
【问题讨论】:
标签: actionscript-3 events event-handling