Главная » Delphi » Delphi 2006 – Шаблон Chain of Responsibility (Цепочка обязанностей)

0

 

Шаблоны поведения (Behavioral) упрощают и проясняют в проекте способы взаимодействия объектов друг с другом. Они формализуют и систематизируют процессы управления внутренней, обычно достаточно сложно организованной работой приложения.

При обработке некоторого запроса внутри программы во многих случаях бывает полезным не завершать его отказом, если конкретный объект-испол- нитель не смог выполнить нужные действия (например, был занят или не справился с заданием), а попробовать передать запрос дальше по цепочке — объектам, которые могут предоставить схожие услуги. Если, например, программа, проверяющая орфографию вводимого текста, не может подобрать слово, схожее по написанию с тем, которое ввел человек, то она может ослабить требования к схожести оригинала с предлагаемым вариантом (увеличив число допустимых ошибок в слове) и таким образом расширить область поиска вариантов написания (рис. 7.14).

В шаблоне выделяется класс Обработчик (THandler), который принимает сообщение, нуждающееся в неформальной обработке, и распределяет его между объектами, способными обработать запрос. Связь между такими объектами организуется путем наследования возможностей класса THandler, а цепочка обслуживания формируется в виде последовательного списка. Сначала создается первый обработчик — экземпляр класса THandler, затем с помощью метода SetSuccessor указывается следующий объект-обработчик

Рис. 7.14. Шаблон Цепочка обязанностей в Дизайнере модели

и так далее. Отметим, что первыми в этом списке надо располагать объекты, способные наиболее точно ответить на сообщение, а далее — менее желательных исполнителей. В результате, когда объект не может обработать сообщение, он просто вызывает соответствующий метод преемника.

type

THandler = class

// ссылка на преемника strict private var ,

FTheSuccessor:THandler;

public

// задать преемника

procedure SetSuccessor(ASuccessor :THandler);

// получить преемника

function GetSuccessor: THandler;

// прикладной метод обработки запроса procedure HandleRequest; virtual;

end;

Класс ConcreteHandler наследует возможности класса THandler. Вот как в нем может быть записана реализация метода обработки запроса.

procedure ConcreteHandler.HandleRequest; var

CanProcessThisRequest :Boolean; begin

I/ определяем способность обработать запрос:

CanProcessThisRequest := False; // или True, если способны

If CanProcessThisRequest Then begin

// обработка запроса end Else begin

// передаем далее по цепочке inherited HandleRequest(); end;

end;

Если теперь подготовить такой код: var cl, с2 , сЗ: ConcreteHandler;

cl:= ConcreteHandler.Create(nil); c2:= ConcreteHandler.Create(cl); c3:= ConcreteHandler.Create(c2);

c3.HandleRequest;

то сначала вызовется метод HandleRequest экземпляра сЗ, затем, если обработка не выполнится, — метод HandleRequest экземпляра с2, и в заключение, при необходимости, — метод экземпляра cl.

Бобровский С. И. Технологии Delphi 2006. Новые возможности. — СПб.: Питер, 2006. — 288 е.: ил.

По теме:

  • Комментарии