Last updated
Last updated
Декораторът е представител на структурните шаблони. Неговото предназначение е динамично да добавя характеристики и функционалности към вече съществуващи обекти, без това да променя тяхната структура. Декораторът се явява като обгръщащ (wrapper) клас за вече съществуващия и имплементира същия интерфейс.
Като илюстрация на шаблона декоратор, нека разгледме следния пример:
Декларираме интерфейс Book:
Необходим е също така клас BookImpl:
Следващата стъпка е създаването на абстрактен клас BookDecorator, в който като частно поле декларираме обект от интерфейса:
Този клас ще бъде базовия декоратор, като всички останали ще го наследяват.
Създаването на обекти и използването на различните декоратори е илюстрирано със следващия програмен фрагмент:
Вижда се, че създаването на книги може да става с различни комбинации от декларираните декоратори, както и повече от едно извикване на един и същи декоратор.
Резултатът е следния:
Кога се използва декоратор:
Когато желаем динамично да добавяме отговорности към обекти без това да оказва влияние върху други такива;
Когато е необходимо да добавим функционалности към обект, които може да променим в бъдеще;
Когато добавянето на наследници/подкласове вече не е практично (станат прекалено много).
Предимства от използването на шаблон Декоратор:
Предоставя по-голяма гъвкавост в сравнение със статичното наследяване;\
Разширява и променя поведението на обекта без използване на подкласове/наследници;
Дава възможност за комбиниране на различни функционалности чрез обгръщане на дадения клас с различни декоратори (последните три обекта в горния пример).
Като недостатък на декоратора може да се посочи факта, че е трудно неговото имплементиране по начин, по който неговото поведение да не зависи от поредността на извикванията.