Главная » Delphi » Delphi 2006 – Шаблон State (Состояние)

0

Шаблон Состояние позволяет выделять элементы поведения объекта, зависящие от его состояния (например, когда среда разработки меняет перечень доступных инструментов в зависимости от текущего объекта, выбранного в Дизайнере). Нередко этот шаблон применяют, чтобы превратить код с большим числом условных операторов и ветвлений в наглядный табличный вид, когда выбор того или иного действия задается не в коде, а в таблице взаимозависимостей. Фактически, шаблон Состояние выделяет некоторое действие в отдельный класс. Применение его в исходном тексте существенно повышает наглядность программы и позволяет избежать модификации громоздких условных конструкций (рис. 7.21).

Рис. 7.21. Шаблон Состояния в Дизайнере модели

Интерфейс Состояния прост:

IState = interface procedure Handle;

end;

Процедура Handle реализует некоторое действие, которое во внешней программе должно выполняться в зависимости от внутреннего условия.

Управляется Состояние в прикладном коде классом-Контекстом.

TContext = class public

procedure SetState(AState :IState);

procedure SomeOperation;

strict private var

FState:IState;

end;

Экземпляры контекста формируются и настраиваются конкретными состояниями (istate). Он оказывается промежуточным классом, инкапсулирующим внутренние интерфейсы состояний.

Допустим, на форме имеется флажок. В зависимости от его состояния мы хотим вызывать то или иное действие, доступное через интерфейс istate. Для этого создадим два класса-наследника IState — TConcreteStatel и TConcreteState2 — с одинаковой структурой.

TConcreteStatel = class(TObject, IState) public

procedure Handle;

end;

B клиентском коде обращение к этим классам может быть таким: var isl, is2: IState;

isl := TConcreteStatel.Create; is2 := TConcreteState2.Create;

if checkboxl.Checked then isl.Handle else is2.Handle;

Как правило, в качестве названий классов выбирают наглядные имена, чтобы ярче отразить предназначение той или иной ветви. Если эти классы содержат лишь исполнимый код, работа которого никак не связана с их внутренними состояниями, то можно сделать эту запись еще нагляднее:

if checkboxl.Checked

then TConcreteStatel.Create.Handle

else TConcreteState2.Create.Handle

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

По теме:

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