TGViewer
Java Geek Java Geek @java_geek · 2.37K subscribers
Post #443 816
📌 Декоратор в Java: Как добавить логику без изменения кода?

🔹 Когда использовать?
- Когда нужно добавить поведение к объекту динамически.
- Когда нельзя или не хочется менять исходный код класса.
- Когда необходимо сохранить принцип открытости/закрытости (OCP из SOLID).

🔹 Как это работает?
Декоратор — это обёртка вокруг базового объекта. Он реализует тот же интерфейс, но внутри может добавлять новую логику.

✅ Пример использования
Допустим, у нас есть базовый интерфейс Notifier, который отправляет уведомления:


public interface Notifier {
void send(String message);
}


И его простая реализация:


public class BasicNotifier implements Notifier {
@Override
public void send(String message) {
System.out.println("Отправка сообщения: " + message);
}
}


Теперь добавим декораторы, которые расширяют функциональность:
1️⃣ Декоратор для отправки в Slack:

public class SlackNotifierDecorator implements Notifier {
private final Notifier wrapped;

public SlackNotifierDecorator(Notifier wrapped) {
this.wrapped = wrapped;
}

@Override
public void send(String message) {
wrapped.send(message); // вызываем базовый метод
System.out.println("Дополнительно отправляем в Slack: " + message);
}
}


2️⃣ Декоратор для отправки в Email:

public class EmailNotifierDecorator implements Notifier {
private final Notifier wrapped;

public EmailNotifierDecorator(Notifier wrapped) {
this.wrapped = wrapped;
}

@Override
public void send(String message) {
wrapped.send(message);
System.out.println("Дополнительно отправляем Email: " + message);
}
}


🚀 Использование:

public class Main {
public static void main(String[] args) {
Notifier notifier = new BasicNotifier();
notifier = new SlackNotifierDecorator(notifier);
notifier = new EmailNotifierDecorator(notifier);

notifier.send("Привет, мир!");
}
}


🔥 Что произойдет?

Отправка сообщения: Привет, мир!
Дополнительно отправляем в Slack: Привет, мир!
Дополнительно отправляем Email: Привет, мир!


🎯 Итог:
✅ Мы не изменяли код BasicNotifier, но добавили новую функциональность.
✅ Гибкость: можем легко комбинировать декораторы в любом порядке.
✅ Код остаётся чистым и расширяемым.

👉 @java_geek
  • ❤ 4
  • 👍 2
  • 👏 2
  • 🔥 1
More from @java_geek
  1. Sep 24, 2026Что такое стек-трейс? Стек-трейс (stack trace) представляет собой список вызовов методов в…
  2. Sep 17, 2026Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)? Д…
  3. Sep 15, 2026Array vs ArrayList Выбор между Array (стандартным Java-массивом) и ArrayList зависит от сп…
  4. Sep 11, 2026Какова цель ключевого слова final, когда оно используется с переменной? Ключевое слово fin…
  5. Sep 9, 2026☕ Java Tip: Как работает var в Java С версии Java 10 появился ключевое слово var. Оно упро…
  6. Sep 7, 2026Что такое перегрузка методов в Java? Перегрузка методов — это мощный приём, который позвол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →