Паттерны GoF - Chain of Responsibility (лекция)
Автор: Rageous
<MiF> Chain of Responsibility
<MiF> цепочка обязанностей
<MiF> Назначение - позволяет избежать конкретной привязки отправителя запроса к получателю, давая шанс обработать запрос нескольким объектам. Связывает получателей запроса в цепочку и передает вопрос по ээтой цепочке, пока его кто-нибудь не обработает или он не дойдет до конца
<MiF> Применять когда:
<MiF> 1. есть много объектов, способых обработать запрос, причем кто конкретно должен - не известно
<MiF> 2. нужно отправить запрос одному из нескольких объектов, не указывая кому именно
<MiF> 3. набор объектов, которые обрабатывают запрос меняется в runtime
<MiF> Участники:
<MiF> 1. Handler - определяет интерфейс для обработки запросов, и может иметь связь с приемником
<MiF> 2. ConcreteHandler - конкретный обработчик, обрабатывает запросы за которые отвечает, имеет доступ к своему преемнику, если не может обработать запрос - шлет его приемнику
<MiF> 3. Client - отправляет запрос какому-то ConcreteHandler с надеждой на обработку :)
<MiF> Результаты:
<MiF> 1. имеем ослабление связанности, ибо отправитель теперь не должен знать кто конкретно обработает его запрос, а получатель - кто его прислал.
<MiF> 2. Можно легко модифицировать распределение обязанностей изменяя цепочку
<MiF> Минусы - обработка запроса не гарантирована
<MiF> По цепочки он может дойти до конца, и так никто его не схавает
<MiF> Сам эту вещь не использовал, но в GUI ее явно где-то можно применить
<Rageous> событие клика идет по списку контролов
<Rageous> пока его кто-то не поймает
<MiF> Ну да
<MiF> Можно простой пример кода
<MiF> Кому нужен?
<Rageous> мне не нужен
<MiF> Padawan?
<Rageous> мне вот интересен пример из игровой механики, где можно было бы применить цепочку отвественности
<MiF> я бы рад, но сам таких не знаю
<Rageous> я вот тож припомнить не могу ни одного
<Rageous> у нас ее применяют для обработки ввода с клавы и мышки
<Rageous> и все вроде бы
<Padawan> я пока слушаю
<MiF> пример кода нужен или нет?
<Padawan> извини, я не присутствоввал с начала
<Padawan> так что поехали дальше
<MiF> ладно, думаю тут итак ясно
<DaGGeR> мне нужен пример кода
<DaGGeR> я тупой
<MiF> ок
<MiF> ушел писать тогда
<DaGGeR> бугога
<MiF> http://www.everfall.com/paste/id.php?hcsunepli6dl
<MiF> заодно применился template method :)
<MiF> вопросы есть?
<Rageous> неа
<MiF> ок, поехали дальше
<MiF> в самое гумно
<Rageous> для гуи это выглядит как "получил - не съел - передал детям"
<MiF> ага
<MiF> можно даже иерархии передач делать
<Rageous> угу
<MiF> только уже не цепочка будет :)
<Rageous> дерево )
<Rageous> впрочем, кого это волнует? :)
<MiF> это смесь этого паттерна и composite
<Rageous> угу
<MiF> ага
22 января 2006