Вообще требования странноватые, на мой взгляд.
Цитата:
user must have functions to disable/enable pooling on command. (for asynchronous execution)
|
Каким образом пул связан с асинхронностью? Понятное дело, что пока экземпляр используется, из пула его получить нельзя.
Цитата:
Command must be automatically removed from the pool if any of it's dependencies are changed/removed.
|
В моем понимании, команда может порождать другую команду, других зависимостей быть у нее не должно. Если мы считаем, что все команды берутся из пула - то очевидно что это требование излишне, слежение за жизненным циклом всех команд производится отдельно от кода самих команд.
Цитата:
Framework must have a function to clear command pool
|
зачем? =) Неужто команды (которые не должны хранить ни данных, ни состояния, ни ссылок) вдруг стали давать критическую массу в оперативной памяти?
Цитата:
OPTIONAL : automatically remove command from the pool after set time interval
|
Это тоже для меня загадка. Команда либо активна в данный момент, либо лежит в пуле и ждет, пока ее сделают активной. И так по кругу. Руками удалять ее из пула нет смысла, ИМО.
PS
Вообще, в плане эксперимента, у меня получилась вот такая конструкция. Не претендую на истину в последней инстанции, но вроде бы подходит под определение "пулинг команд":
Код AS3:
package
{
import flash.utils.Dictionary;
import flash.utils.describeType;
import flash.utils.getQualifiedClassName;
/**
* Global command runner
*/
public class Command
{
public function Command()
{
super();
}
private static const _classList:Dictionary = new Dictionary();
public static function run(commandClass:Class, ...args):void
{
if (!commandClass) throw new ArgumentError("Parameter must be not-null!");
if (!(commandClass in _classList))
{
var className:String = getQualifiedClassName(Command);
var description = describeType(commandClass);
var isInheritedCommand:Boolean = Boolean(description..extendsClass.(@type == className));
if (!isInheritedCommand) throw new Error("Only Command-inherited classes are allowed!");
_classList[commandClass] = new Array();
}
var pool:Array = _classList[commandClass] as Array;
var command:Command = (pool.length ? pool.pop() : new commandClass()) as Command;
command._pool = pool;
command.run.apply(command, args);
}
private var _pool:Array;
/**
* Call this method to return this command instance to associated pool
*/
protected final function finalize():void
{
_pool.push(this);
}
/**
* Run command with specified arguments
*/
protected function run(...args):void
{
throw new Error("Methot-override is supposed here!");
}
}
}
Что нам нужно делать, так это:
- отнаследоваться от этого класса
- оверрайдить метод run
- внутри метода run (или где-то еще, если команда асинхронная) не забыть вызвать finalize()
Запускать всегда через
Код AS3:
Command.run(CommandExample, "hello, world!")
Да, единственное, что придется еще дописать - это свою реализацию IEventDispatcher, унаследованную от класса Command. Но, думаю, за этим дело не станет =)