Главная » Delphi » Delphi 2006 – Шаблон Decorator (Декоратор)

0

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

Рис. 7.10. Шаблон Декоратор в Дизайнере модели

Шаблон Декоратор предлагает основной интерфейс TComponent — его расширенная функциональность реализуется в классе TConcreteComponent. Физически же формируются наследники Декоратора, которые, с одной стороны, хранят ссылку на экземпляр класса, реализующего интерфейс TComponent, чтобы он выполнил основной вызванный метод, а с другой стороны, дополняют ее собственными действиями.

Допустим, имеется следующее описание класса.

TComponent = class abstract public

procedure DoSomeStuff; virtual; abstract;

end;

Он реализован следующим образом.

TConcreteComponent = class(TComponent) public

///< i ssubrout ine>True</i ssubrout ine>

procedure DoSomeStuf f; override;

end;

Допустим, мы желаем расширить функциональность метода DoSomeStuf f с помощью Декоратора. Вот как записывается декорирующий класс.

TDecorator = class abstract(TComponent) strict protected var

FComponent: TComponent; // ссылка на оригинальный компонент

public

procedure DoSomeStuff; override;

constructor Create(ADecorateMe :TComponent);

end;

А его класс-наследник записывается так.

TConcreteDecorator = claee(TDecorator) public

procedure DoSomeStuff; override; constructor Create(ADecorateMe :TComponent) ;

strict private

procedure AddedBehavior; // оригинальное поведение

end;

Как правило, таких классов-наследников абстрактного Декоратора в реальных проектах создается несколько.

Ключевой процедурой здесь является реализация метода DoSomeStuff.

procedure TConcreteDecorator.DoSomeStuff; begin

inherited DoSomeStuff; AddedBehavior(); end;

Здесь выполняется родительская реализация метода DoSomeStuff, расширяющая возможности наследуемого метода. А вызывается на самом деле метод DoSomeStuff объекта FComponent, реализующего базовую функциональность класса TComponent.

procedure TDecorator.DoSomeStuff; begin

FComponent.DoSomeStuff(); end;

var сс: TComponent;

dc: TDecorator; begin

cc := TConcreteComponent.Create; dc := TConcreteDecorator.Create(cc); dc.DoSomeStuff;

Вызываться же методы будут в таком порядке:

• метод DoSomeStuff, наследуемый объектом dc . В нем имеется прямое обращение к методу FComponent .DoSomeStuff (), который в нашем случае представляет собой метод объекта сс;

• метод AddedBehavior объекта dc, продолжающий работу метода DoSomeStuff.

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

По теме:

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