Архитектура движка.Статьи

Паттерны GoF - Observer -> Multicast/Typed Message (лекция)

Автор:

<MiF> Observer
<MiF> Назанчение - определяет зависиость "один ко многим", между объектами, так
  что при изменении состояния одного все зависимые автоматически оповещаются и
  обновляются
<MiF> Применять когда:
<MiF> 1. когда при модификации одного объекта требуется оповестить множество
  других, и при этом не известно сколько конкретно
<MiF> при этом не хочется делать тесные связи между ними
<MiF> Участники:
<MiF> 1. Subject - субъет, знает инфу о своих наблюдателях, за одним субъектом
  следит любое количество наблюдателей, дает интерфейс для присоединения и
  отделения наблюдателя
<MiF> 2. Observer - наблюдатель, определяет интерфейс для обновления
  уведомляемых об изменении субъетка объектов
<MiF> 3. ConcreteSubject - реализует Subject, посылает информацию всем
  наблюдателям при изменении, сохраняет состояние, которое представляет интерес
  для конкретного наблюдателя
<MiF> 4. ConcreteObserver - реализует интерфейс для обновления, хранит ссылку
  на ConcreteSubject и хранит данные, которые должны быть согласованы с данными
  субъекта
<MiF> Что в результате
<MiF> 1. можно менять субъекты и наблюдатели независимо друг от друга, можно
  добавлять новые наблюдатели без модификации субъекта
<MiF> 2. Субъекты не известны конкретные классы наблюдателей
<MiF> 3. Уведомление автомтически идет всем подписанным наблюдателям, что с ним
  делать решает сам наблюдатель
<MiF> Минусы понятны - можно запутаться нафиг при сложной системе оповещений и
  обновлений вызываемых наблюдателями
<MiF> Пример кода думаю нужен
<MiF> писать пошел
<kas> да
<Sark7> та не
<Sark7> тут все понятно
<Sark7> listener, notifier etc
<Sark7> java-way
<Sark7> :)
<kas> %)
<MiF> в java observer в стандарте :)
<MiF> че-то не рожу пример никак
<MiF> чтоб жизненный
<MiF> и из gamedev
<kas> ну как
<kas> гуи :)
<MiF> не, это понятно
<MiF> о ща
<MiF> :)
<MiF> не
<MiF> ну какой-нибудь с игровыми объектами
<MiF> типа чаров оповещать о чем-то
<MiF> ?
<Zeux|away> MiF можнол
<MiF> ладно, со спелами будет :)
<MiF> http://www.everfall.com/paste/id.php?yv21islecubv
<MiF> пример сакс
<MiF> :)

...

<MiF> короче Observer - хорошо
<MiF> но у него есть понтовый родственник
<MiF> в GoF он не описан, его Влиссидес описал потом в своей клевой маленькой
  книжке
<MiF> Multicast
<MiF> Назначение - передача информации с произвольной структурой между
  множеством объектов при сохранении статической типизации
<MiF> Участники:
<MiF> 1. Message - инкапсулирует информацию, которую необходимо передать от
  отправителя к получателю
<MiF> 2. Sender - имеет список получателей, определяет интерфейс для их
  регистрации, определяет и реализует интерфейс для доставки сообщений
  зарегистрированным получателям
<MiF> 3. AbstractReceiver - определяет интерфейс для получения объекта Message
<MiF> 4. Receiver - реализует один или несколько интерфейсов AbstractREceiver
<MiF> короче Multicast - это отдельный паттерн только для языков со строгой
  типизацией
<MiF> потому GoF долго спорила, но так его как отдельный и не вынесла
<MiF> типа сказали, что это вариант Observer'а
<MiF> Применять когда:
<MiF> 1. определенные классы объектов должны получать информацию от других
  объектов
<MiF> 2. информацию имеет произвольную структуру и может менятся по мере
  эволюции преокта
<MiF> *проекта
<MiF> 3. Нужна статическая типизация при передачи
<MiF> 3 условая одновременно
<MiF> а не как обычно :)
<MiF> короче реализация жжот
<MiF> многим понравится
<kas> davai primer
<xmvlad> всем привет
<MiF> хай
<MiF> ты все пропустил :)
<MiF> короче, посмотрел в шпаргалку
<MiF> я малость попутал
<MiF> Мужики из GoF упразднили multicast
<MiF> и сделали из него pattern Typed Message
<MiF> короче вопрос названий
<MiF> хрен с ним
<MiF> реализация
<MiF> http://researchweb.watson.ibm.com/designpatterns/pubs/typed-msg.html
<MiF> листать в конец
<MiF> это почти стандартный вариант
<MiF> http://www.gamedev.ru/articles/?id=70119&page=2
<MiF> это тоже реализация typed message
<MiF> Где это может быть полезно:
<MiF> везде, где нужна система передачи сообщений, с сохранением строгой
  типизации
<MiF> мой знакомый на эту идею подсел, в итоге целый семестр оттачивал свой
  task-manager на typed message паттерне
<MiF> на этом силы его иссякли :)
<MiF> вопросы есть?
<MiF> У меня у самого менеджер задач написан по этому паттерну, и не
  используется :) просто в коде лежит для красоты и понтов :)
  сообщения определяется на этапе компиляции?
<MiF> да
<MiF> пишется обработчик события
<MiF> со строгим типом параметра
<MiF> все посмотрели и никому не понравилось? или всех так пригрузило?
<xmvlad> по первой ссылки вроде понятно....
<MiF> вообщем могу одно точно сказать - это дело обобщается до полностью
  масштабируемого варианта
<MiF> если использовать статические регистраторы
<MiF> в итоге внутри сложно, а поддержка - простая до нельзя
<MiF> http://www.gamedev.ru/articles/?id=70119&page=2 здесь так сделано, только
  подробности опущены
<MiF> ладно, это паттерн типа "фтыкал, много думал"
<MiF> потом обсудим
<MiF> я бы на этом на сегодня закончил

21 января 2006

Комментарии [2]