Главная » Delphi » Шаблон Composite (Компоновщик)

0

Шаблон Компоновщик предоставляет интерфейс, обеспечивающий одинаковую работу как с отдельным классом, так и с набором классов, поддерживающим те же методы. Это полезно в случаях, когда команду надо одновременно выполнить большому числу схожих по структуре объектов, хотя и принадлежащих, возможно, разным классам (рис. 7.9).

Допустим, имеется класс TLeaf, аналогов которого в прикладной программе (как и их экземпляров) может быть множество.

TLeaf = class(TComponent) public

procedure SampleOperation(i :Integer);override;

end;

Рис. 7.9. Шаблон Компоновщик в Дизайнере модели

Работа с такими базовыми классами обеспечивается абстрактным классом TComponent

TComponent = class abstract public

function Components: IEnumerator; virtual; procedure Remove(AComponent :TComponent); virtual; procedure Add(AComponent :TComponent); virtual; procedure SampleOperation(i :Integer); virtual; abstract;

end;

Класс TComponent позволяет добавлять и удалять отдельные объекты, предоставляет универсальный интерфейс IEnumerator к набору элементов, а также обеспечивает выполнение метода SampleOperation для каждого из них. При этом любой из элементов данного класса, в свою очередь, может быть представителем как отдельного объекта TLeaf, так и составного — экземпляра TComponent. Таким образом можно строить древовидные структуры отношений между классами, а обращение к методу SampleOperation вызывает автоматический рекурсивный обход этого дерева.

Отметим возможную реализацию прикладного метода SampleOperation, который предназначен для вызова из прикладной программы. В нем задействован новый оператор Delphi for … in … , предназначенный для перебора всех элементов коллекции.

procedure TComposite.SampleOperation(i :Integer);

var current: TComponent;

begin

for current in FComponentList do

begin

current.SampleOperation(i);

end end;

Прикладное построение дерева может быть, например, таким.

var ad: TComponent; // главный интерфейс If: TLeaf; // простой узел cl, с2: TComposite; // составные узлы

ad:= TComposite.Create;

// добавляем простой узел 1f:= TLeaf.Create; ad.Add(If);

// создаем будущий составной узел cl:= TComposite.Create;

// строим его содержимое из двух простых: с1.Add(If); с1.Add(If);

// добавляем составной узел в главный интерфейс: ad.Add(с1);

// добавляем еще один простой узел: ad.Add(If);

// выполняем наш метод SampleOperation(), который будет автоматически вызван для каждого простого узла, связанного с объектом ad:

ad.SampleOperation(3);

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

По теме:

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