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

Паттерны GoF - Chain of Responsibility (лекция)

Автор:

<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  ее явно где-то можно применить

  • MiF sets mode: -m
  • <Rageous> хм... в гуи ее применять-то легко
    <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