Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «У чому суть патерна Decorator?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Decorator (Декоратор)** - це **структурний патерн**, що дозволяє **динамічно додавати об'єкту нову поведінку**, не змінюючи його клас і не порушуючи принцип відкритості/закритості (OCP). **Ключове:** декоратор обгортає об'єкт в інший об'єкт, що реалізує той самий інтерфейс, але додає поведінку до або після виклику оригінальних методів.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Decorator (Декоратор)** - це **структурний патерн**, що дозволяє **динамічно додавати об'єкту нову поведінку**, не змінюючи його клас і не порушуючи принцип відкритості/закритості (OCP). --- ### 1. **Суть ідеї** Замість того, щоб створювати безліч підкласів для розширення функціональності, декоратор **обгортає об'єкт в інший об'єкт**, який реалізує той самий інтерфейс, але додає додаткову поведінку *до або після* виклику оригінальних методів. --- ### 2. **Коли використовувати** - Коли потрібно **розширити поведінку об'єкта під час виконання**, а не на етапі успадкування. - Коли неможливо або небажано змінювати вихідний код класу (наприклад, він зі сторонньої бібліотеки). - Коли потрібно **комбінувати кілька функцій**, не створюючи вибух кількості підкласів. --- ### 3. **Приклад (Java)** ```java interface DataSource { void write(String data); } class FileDataSource implements DataSource { public void write(String data) { System.out.println("Запис у файл: " + data); } } class EncryptionDecorator implements DataSource { private DataSource wrappee; public EncryptionDecorator(DataSource source) { this.wrappee = source; } public void write(String data) { data = encrypt(data); wrappee.write(data); } private String encrypt(String data) { return "Encrypted(" + data + ")"; } } ``` Використання: ```java DataSource source = new EncryptionDecorator(new FileDataSource()); source.write("Hello"); ``` Результат: `FileDataSource` працює як раніше, але тепер дані шифруються перед записом. --- ### 4. **Переваги** - Поведінку можна **додавати динамічно**, без зміни вихідного класу. - Можна **комбінувати кілька декораторів** (логування + стиснення + шифрування). - Підтримує принцип **композиції замість успадкування**. --- ### 5. **Підсумок** **Decorator** - це спосіб "надягнути додаткові функції" на об'єкт, залишивши його інтерфейс незмінним. Він перетворює жорстке успадкування на **гнучке, динамічне розширення поведінки**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.