|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Глобальный доступ к объекту без синглотона или ДИ
Допустим есть такой класс ResourseManager, который абстрагирует доступ приложения к разному типу данных (картинки, звуки, тескта и т.д.).
Все приложение получает данные именно через него. Что бы дать всему приложению доступ на него существует несколько разных способов: 1 - Синглтон. Думаю что реализацию и возможные проблемы вы уже знаете. 2 - ДИ. Вообщем для данной проблемы не плохой подход, однако не хочется прикручивать ДИ движок к приложению, так как это преопределит его архитектуру не так как мне этого хочется. 3 - Впихнуть ResourseManager в основную модельку и через нее все получать. То же вроде бы не плохой вариант, однако мне кажется идеологически не правельным засовывать ResourseManager в модель, так как хотелось бы что бы у представления была непосредственная ссылка на него. 4 - Можно кидать евент, в который передать каллбек. Евент будет ловится медиатором, и обработчике будет вызыватся коллбек, как только данные будут загружатся. Вообщем этот вариант конечно полностью отгораживает нас от ссылки на ресоурс менеджер, но тогда каждое обращение к ResourseManager выльется в несколько строчек. Да и вообще мне кажется это не правильным, так как код будет не приятным для обслуживания, дебага и вообще это просто не правильно Вообщем посоветуйте плиз, как реализовать функционал общего доступа, что бы он был как можно более гибок, и как можно менее затратен в плане написания кода каждого обращения к нему. Зарание благодарен.
__________________
ranga |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Минусы синглтона это почти минусы глобального доступа, вы хотите глобальный доступ без глобального доступа.
У меня это статическая функция вообще и не парюсь)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Накидаю возможный пример (если синглтон):
public class BaseImage extends Sprite{ public function BaseImage(uri:String = ""){ if(uri) this.uri = uri; } public function set uri(s:String):void{ ResourseManager.instanse.getResourse(s, _onImageReceived); } private function _onImageReceived(image:*):void{ if(image is BitmapData){ addChild(new Bitmap(image as BitmapData)); }else{ addChild(image); } } } public class UIProvider implements IResourseProvider{ [Embed(source="example.png")] public var example:Class; public function UIProvider(){ ResourseManager.instanse.registerNamespace("ui", this); } public function getResourse(urn:String, callback):void{ callback(new (this[urn] as Class)()); } } Добавлено через 2 минуты Цитата:
__________________
ranga |
|
|||||
Modus ponens
|
Только ведь объекты созданные в классе-документе приложения могут / должны пользоваться ресурсами - логично сделать ссылку на менеджер ресурсов свойством этого класса. Соответственно, таким образом можно избежать накладок при загрузке одной флешки в другую - когда статические методы перекроются. Собственно, loaderInfo.applicationDomain.getDefinition() выполняет ту самую задачу, с которой вы столкнулись. Выполняет ее нормально, не вижу смысла делать по-другому.
__________________
Hell is the possibility of sanity |
|
|||||
wvxvw, я не очень понял что Вы имеете ввиду.
Для простоты примера: public class Main extends Sprite{ private var resourseManager:ResourseManager; public function Main(){ resourseManager = new ResourseManager(); } } Цитата:
__________________
ranga |
|
|||||
[+4 06.05.14]
|
Цитата:
Но чтобы такого не было, помоему мвс для этого и сделали
__________________
Марк Tween |
|
|||||
Modus ponens
|
Почему? - потому что вы не знаете кто может загрузить эту флешку, и нужны ли загрузчику те же статические переменные, что и данной флешке.
Как раздать ссылку? - public class Main extends Sprite implements IResourcemanager { // Получить ссылку на класс конструктор ресурса. public function recourceFactory(id:String):Class { return this._knownClasses[id]; } // Возможно, ресурсы кешируются, используются по-новой. public functin resource(id:String):Object { return this._availableResources[id]; } public function recycle(id:String, resource:Object):void { this._availableResources[id] = resource; } public function Main() { super(); ResourceManager.addManager(this); } . . . /* ResourceManager */ public static function addManager(manager:IResourceManager):void { _managers[getQualifiedClassName(manager)] = manager; } public static function getResource(manager:String, id:String):Object { return _managers[manager].resource(id); } . . .
__________________
Hell is the possibility of sanity |
|
|||||
Цитата:
__________________
...вселенская грусть |
Часовой пояс GMT +4, время: 21:52. |
|
« Предыдущая тема | Следующая тема » |
|
|