Класс для хранения настроек приложения на ActionScript3
Для хранения настроек ActionScript-приложения удобно использовать класс-Singleton, к которому на лету можно добавлять свойства. Решение по мотивам примера из книги Advanced ActionScript 3 with Design Patterns.
package crisp.project
{
import flash.utils.Proxy;
import flash.utils.flash_proxy;
dynamic public class Settings extends Proxy
{
static private var _instance:Settings;
private var _data:Object;
public function Settings(enforcer:SingletonEnforcer)
{
_data = new Object();
}
public static function getInstance():Settings
{
if (Settings._instance == null)
{
Settings._instance = new Settings(new SingletonEnforcer());
}
return Settings._instance;
}
override flash_proxy function getProperty(name:*):*
{
if (name in _data)
{
return _data[name];
}
else
{
return undefined;
}
}
override flash_proxy function setProperty(name:*, value:*):void
{
_data[name] = value;
}
}
}
class SingletonEnforcer {}
Для реализации паттерна Singleton на ActionScript используется т.н. Same-file Helper Classes, это классы, которые доступны только классу, определённому в .as файле внутри package. Использование экземпляр класса SingletonEnforcer в качестве параметра конструктора фактически делает невозможным создание экземпляра класса Settings за пределами файла, в котором он описан.
Для того, чтобы обработать обращение к динамическим свойствам класса используется класс базовый класс Proxy.
Пример использования класса настроек:
package crisp.project.ui.base
{
import flash.display.*;
import crisp.project.*;
public class SomeBaseSpriteClass extends Sprite
{
protected var _settings:Settings = Settings.getInstance();
function SomeBaseSpriteClass()
{
_settings.letsCreateAnySetting = 'Hello, World!';
trace(_settings.letsCreateAnySetting);
}
}
}
В качестве внутреннего хранилища настроек для данного класса вместо обычного динамического объекта Object можно использовать любую другую нужную структуру данных.
P.S. Это первый snippet про ActionScript :)
