Это немного подробный пример, но я думаю, что могу объяснить шаблон в 2 строки.
Шаблон декоратора позволяет обернуть существующую реализацию интерфейса.
Другое название шаблона - обертка.
Например, у вас есть интерфейс Foo:
interface Foo {
public int foo();
}
class SimpleFoo implements Foo {
public int foo() {
return 1;
}
}
SimpleFoo.foo () всегда возвращает 1;
Вот простой декаратор:
class DoubleFoo implements Foo {
private Foo payload;
public DoubleFoo(Foo payload) {
this.payload = payload;
}
public int foo() {
return 2 * payload.foo();
}
}
DoubleFoo.foo()
украшает полезную нагрузку Foo. Результат умножается на 2.
Очевидно, что он также может заменить реализацию полезной нагрузки своей собственной реализацией. но это не классический случай паттерна.
Самым известным примером использования этого шаблона является IO в java: потоки, читатели и записывающие устройства являются оболочками. Например, BufferedReader добавляет функциональность для считывателя полезной нагрузки: он считывает данные в буферы.