Decorator

Декораторът е представител на структурните шаблони. Неговото предназначение е динамично да добавя характеристики и функционалности към вече съществуващи обекти, без това да променя тяхната структура. Декораторът се явява като обгръщащ (wrapper) клас за вече съществуващия и имплементира същия интерфейс.

Като илюстрация на шаблона декоратор, нека разгледме следния пример:

Декларираме интерфейс Book:

public interface Book {
    String decorateBook();
}

Необходим е също така клас BookImpl:

public class BookImpl implements Book{
    @Override
    public String decorateBook() {
        return "Book has: ";
    }
}

Следващата стъпка е създаването на абстрактен клас BookDecorator, в който като частно поле декларираме обект от интерфейса:

public abstract class BookDecorator implements Book {
    private Book book;
    public BookDecorator(Book book) {
        this.book = book;
    }
    @Override
    public String decorateBook() {
        return book.decorateBook();
    }
}

Този клас ще бъде базовия декоратор, като всички останали ще го наследяват.

Създаването на обекти и използването на различните декоратори е илюстрирано със следващия програмен фрагмент:

Вижда се, че създаването на книги може да става с различни комбинации от декларираните декоратори, както и повече от едно извикване на един и същи декоратор.

Резултатът е следния:

Кога се използва декоратор:

  • Когато желаем динамично да добавяме отговорности към обекти без това да оказва влияние върху други такива;

  • Когато е необходимо да добавим функционалности към обект, които може да променим в бъдеще;

  • Когато добавянето на наследници/подкласове вече не е практично (станат прекалено много).

Предимства от използването на шаблон Декоратор:

  • Предоставя по-голяма гъвкавост в сравнение със статичното наследяване;\

  • Разширява и променя поведението на обекта без използване на подкласове/наследници;

  • Дава възможност за комбиниране на различни функционалности чрез обгръщане на дадения клас с различни декоратори (последните три обекта в горния пример).

Като недостатък на декоратора може да се посочи факта, че е трудно неговото имплементиране по начин, по който неговото поведение да не зависи от поредността на извикванията.

Last updated

Was this helpful?