Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.01.2011, 22:09
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 1  
Ответить с цитированием
Alexmody

Регистрация: Dec 2010
Сообщений: 177
По умолчанию Передача данных в паттерне Observer

При реализации паттерна Observer (наблюдатель) появились вопросы по реализации
универсального получения/передачи данных.

Есть BaseSubject (субъект/model в MVC- кто рассылает события всем подписавшимся
обозревателям) от него наследуются два класса SubjectA и SubjectB.

Есть класс BaseData от котрого наследуются DataA (имеет переменные level, score),
и DataB (имеет переменные time, coins).
В данном случае данные DataA и DataB создаются отдельно от BaseSubject/model в MVC,
но на них предается ссылка в соотв. экземпляр SubjectA и SubjectB.


В BaseSubject есть ф-я изменения данных (для дальнейшей рассылки обозревателям) в
которую входит параметр класса BaseData, т.е. ф-я может принять вышеописанные
SubjectA и SubjectB.

Код:
public class SubjectA/SubjectB extends BaseSubject
{
    public function setData(data:BaseData):void
    {
            if(data  is DataA)
           {
                 this.data.level = data.level;
                 this.data.score = data.score;
           }

           if(data  is DataB)
           {
                 this.data.time  = data.time;
                 this.data.coins = data.coins;
           }

           //передаем данные всем подписанным обозревателям.
           notifyObservers();		
    }
}
Как видно выше передается нужный класс данных типа BaseData, обычно в примерах
паттерна Observer принимается перечисленные переменные: setData(level:int, score:int):void,
но куда удобнее применить общий тип данных для всех экземпляров наследуемых от
BaseSubject, но в это же время появляется проблема с обработкой этих данных.
Тот пример, что привел выше мне не нравится, нагромождение и не универсально, приходится
с каждым новым типом данных прописывать дополнительные применять if.

Можно еще предварительно не поставлять входящие данные а в функцию setData(…) класса
BaseSubject, а запрашивать объект DataA/DataB ф-й GetData():BaseData, и изменять
его возвращенные данные.

В экземплярах классов Observer прием данных тот же:
public override function updateData(data:BaseData):void

Посоветуйте, как лучше организовать передачу данных реализуя паттерн Observer, при
этом желательно, чтобы отправленные/полученные данные были в виде класса, а не
набора кучи параметров функции.


Последний раз редактировалось Alexmody; 07.01.2011 в 22:17.
Старый 07.01.2011, 23:40
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 2  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Обсервер не нужен - есть EventDispatcher
__________________
Отряд Котовскага

Старый 08.01.2011, 00:37
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 3  
Ответить с цитированием
Alexmody

Регистрация: Dec 2010
Сообщений: 177
Добавлено через 2 минуты
Я предпочитаю замену EventDispatcher, ссылками на родителя, а для передачи данных Observer.
Суть не в том, через что можно реализовать вещатель, а в обработке данных.


Последний раз редактировалось Alexmody; 08.01.2011 в 01:03.
Старый 08.01.2011, 01:11
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 4  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
без кастования данных совсем не обойтись. или я вас совсем не понял
хэндлер принимает базовый тип, если нужно уточнить используйте is, а вобще не стоит городить огород - используйте EventDispatcher - на крайняк слоты. Там много хороших проверенных и главное известных другим методик и багов.

а вообще лучший вариант так:
Код AS3:
public class SubjectA/SubjectB extends BaseSubject
{
    public function set data($data:BaseData):void
    {
            this._data = $data
           //передаем данные всем подписанным обозревателям.
           notifyObservers();	
//или           
 dispatchEvent(new DataEvent(Event.CHANGE,true,true,_data));	
    }
}
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 08.01.2011 в 01:19.
Старый 08.01.2011, 01:48
Alexmody вне форума Посмотреть профиль Отправить личное сообщение для Alexmody Найти все сообщения от Alexmody
  № 5  
Ответить с цитированием
Alexmody

Регистрация: Dec 2010
Сообщений: 177
Спасибо, что привели код, но как раз первый вариант вещания данных я делал с
помощью dispatchEvent, т.е. в точности, что вы привели.
Варианты dispatchEvent и реализация классического Observer (по книжке ActionScript 3.0 Design Patterns )
оба хороши, просто дело вкуса, проблема в другом: я хотел бы избавиться от ифов, а также от копирования
не измененных данных, при изменении одного, к примеру был изменен level, но в коде приходится копировать
все переменные...или проверять их на изменение...

Код AS3:
if(data  is DataA)
 {
       this.data.level = data.level;//изменен, копируем
       this.data.score = data.score;//не изменен, но копируем
       ...//не изменен, копируем
 }


Последний раз редактировалось udaaff; 08.01.2011 в 01:54.
Старый 08.01.2011, 02:18
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 6  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Может и не правильно, но я на сеттер level вешал диспатч событий "levelChange" и "change"
либо заводил level как отдельную субмодель
тогда подписка в каком нибудь представлении была бы такая
Код AS3:
model.level.addEventListener(Event.CHANGE, updateLevelBar)
// любое изменение модели, если поддерживается бабблинг в структурах моделей
model.addEventListener(Event.CHANGE, log)
меняем level:
Код AS3:
level.data  = 3;
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 08.01.2011 в 02:39.
Создать новую тему Ответ Часовой пояс GMT +4, время: 10:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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