Я обсуждаю два подхода к довольно типичной проблеме: знать, когда происходит событие, или немедленно реагировать на него, если оно уже произошло.
При первом подходе пользователь 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 и меньше кода. Это может потенциально создать нежелательные побочные эффекты, когда есть несколько слушателей, потому что событие будет срабатывать один раз при каждом добавлении слушателя.
Второй метод понятен и его легче отлаживать, но он требует больше предварительной работы и, похоже, нарушает инкапсуляцию загрузчика.