Паттерны GoF - Observer -> Multicast/Typed Message (лекция)
Автор: MiF
<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]