![]() |
Передача данных в паттерне 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паттерна Observer принимается перечисленные переменные: setData(level:int, score:int):void, но куда удобнее применить общий тип данных для всех экземпляров наследуемых от BaseSubject, но в это же время появляется проблема с обработкой этих данных. Тот пример, что привел выше мне не нравится, нагромождение и не универсально, приходится с каждым новым типом данных прописывать дополнительные применять if. Можно еще предварительно не поставлять входящие данные а в функцию setData(…) класса BaseSubject, а запрашивать объект DataA/DataB ф-й GetData():BaseData, и изменять его возвращенные данные. В экземплярах классов Observer прием данных тот же: public override function updateData(data:BaseData):void Посоветуйте, как лучше организовать передачу данных реализуя паттерн Observer, при этом желательно, чтобы отправленные/полученные данные были в виде класса, а не набора кучи параметров функции. |
Обсервер не нужен - есть EventDispatcher
|
Добавлено через 2 минуты
Я предпочитаю замену EventDispatcher, ссылками на родителя, а для передачи данных Observer. Суть не в том, через что можно реализовать вещатель, а в обработке данных. |
без кастования данных совсем не обойтись. или я вас совсем не понял
хэндлер принимает базовый тип, если нужно уточнить используйте is, а вобще не стоит городить огород - используйте EventDispatcher - на крайняк слоты. Там много хороших проверенных и главное известных другим методик и багов. а вообще лучший вариант так: Код AS3:
|
Спасибо, что привели код, но как раз первый вариант вещания данных я делал с
помощью dispatchEvent, т.е. в точности, что вы привели. Варианты dispatchEvent и реализация классического Observer (по книжке ActionScript 3.0 Design Patterns ) оба хороши, просто дело вкуса, проблема в другом: я хотел бы избавиться от ифов, а также от копирования не измененных данных, при изменении одного, к примеру был изменен level, но в коде приходится копировать все переменные...или проверять их на изменение... Код AS3:
|
Может и не правильно, но я на сеттер level вешал диспатч событий "levelChange" и "change"
либо заводил level как отдельную субмодель тогда подписка в каком нибудь представлении была бы такая Код AS3:
Код AS3:
|
| Часовой пояс GMT +4, время: 11:50. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.