Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как лучше организовать взаимодействие между несвязанными объектами? (http://www.flasher.ru/forum/showthread.php?t=165396)

Korchy 22.08.2011 17:47

Как лучше организовать взаимодействие между несвязанными объектами?
 
Например у меня есть несколько графических объектов, вокруг которых рисуется квадратная рамка. И есть класс пользовательских настроек, в котором есть CheckBox со значением true - рисовать рамки, false - нет. В отдельном окошке можно переключать чек-бокс. Как организовать передачу данных при изменении пользователем состояния чек-бокса? Т.е. - снял чек-бокс - спрятались рамки. В голову приходит навесить на каждый объект слушатель события и генерировать это событие при изменении пользователем настроек. Но тогда в приложении будут постоянно висеть десятка два слушателей по сути ничем не занятых и использоваться они будут очень редко. Вроде выходит не рационально. А как можно сделать еще?

toFL 22.08.2011 17:51

Сделайте контроллер изображений (ImageController). Подпишите его на одно событие от объекта, который изменяет состояние чекбокса. Затем этот контроллер скажет всем графическим объектам:
Код AS3:

obj.frame = Model.frame;


Korchy 22.08.2011 18:00

Цитата:

Сообщение от toFL (Сообщение 1024491)
Сделайте контроллер изображений (ImageController). Подпишите его на одно событие от объекта, который изменяет состояние чекбокса. Затем этот контроллер скажет всем графическим объектам:
Код AS3:

obj.frame = Model.frame;


Что такое контроллер изображений? Контейнер в который поместить их все и подписать его один на событие? У меня итак они все в контейнере, но дело в том, что не все изображения в контейнере имеют рамки и в этом случае придется тоже делать какое-то выборочное обращение только к нужным объектам.

toFL 22.08.2011 18:10

Цитата:

Что такое контроллер изображений?
Что-то типа того:
Код AS3:

package {
        public class ImageController {
                private var model:EventDispatcher;
                private var list:Array;
 
                public function ImageController(model:EventDispatcher, list:Array) {
                        model.addEventListener(Event.CHANGE, onChange);
                        this.list = list;
                }
                private function onChange (event:Event):void {
                        for (var i:uint = 0; i < list.length; i++) {
                                (list[i] as GraphObject).frame = model.frame;
                        }
                }
        }
}

Цитата:

но дело в том, что не все изображения в контейнере имеют рамки и в этом случае придется тоже делать какое-то выборочное обращение только к нужным объектам.
В этом случае сам объект уже решает, есть у него рамка или нет. Обращайтесь ко всем.

Korchy 22.08.2011 22:07

Цитата:

Сообщение от toFL (Сообщение 1024502)
Что-то типа того:

Контейнер. Понятно. Нечто подобное у меня и есть под названием "сцена". Ну, раз других идей нет, сделаю так.

GBee 22.08.2011 23:43

Цитата:

но дело в том, что не все изображения в контейнере имеют рамки и в этом случае придется тоже делать какое-то выборочное обращение только к нужным объектам.
Для таких дел есть интерфейсы (is). Или obj.hasOwnProperty("frame"). Но интерфейсы волшебнее.

Korchy 23.08.2011 11:59

Цитата:

Сообщение от GBee (Сообщение 1024601)
Для таких дел есть интерфейсы (is). Или obj.hasOwnProperty("frame"). Но интерфейсы волшебнее.

Использование приведения типов - зло. Тогда уж, как писал toFL, нужно использовать полиформизм.

GBee 23.08.2011 12:10

Цитата:

Использование приведения типов - зло.
1) А где приведение типов?
2) Почему зло?

gloomyBrain 23.08.2011 12:20

Говоря о примере toFL - зачем конроллеру обновлять отображения? для этого есть события:
Код AS3:

 
model.dispatchEvent(new Event(Event.CHANGE));
 
...
 
// где-то в объекте отображения
model.addEventListener(Event.CHANGE, onModelChange);

Для удобства можно сделать модель статическим объектом. Отображения должны обновляться при добавлении на сцену (Event.ADDED_TO_STAGE) и в момент добавления начинать слушать события модели. Как только отображение удаляется со сцены (Event.REMVED_FROM_STAGE), оно должно прекращать слушать модель.
... и никаких циклов, никаких массивов

toFL 23.08.2011 12:32

Код AS3:

// где-то в объекте отображения
model.addEventListener(Event.CHANGE, onModelChange);

Ага, и затем Вам необходимо изменить model (например сделать другой или изменить параметры и т.п.) и "привет" изменения в классах самого нижнего уровня. Недавно был огромный холивар на эту тему (Статические параметры и т.п.).
Поэтому:
Цитата:

... и никаких циклов, никаких массивов
сомнительный аргумент.

Добавлено через 11 минут
Цитата:

Контейнер. Понятно
Контейнер - хранит в себе дочерние объекты.
Контроллер - УПРАВЛЯЕТ однотипными объектами
Это разные вещи.


Часовой пояс GMT +4, время: 03:15.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.