733просмотров
29.7%от подписчиков
29 декабря 2025 г.
questionScore: 806
📌 Декоратор в 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