Класс для хранения настроек приложения на ActionScript3

26.06.2010 11:52 / Артём Волк / 793 просмотра / ...

Для хранения настроек 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 :)