Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Яку проблему вирішує патерн «Компонувальник»?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Патерн **Composite (Компонувальник)** вирішує проблему **роботи з ієрархічними структурами об'єктів**: він дозволяє **звертатися до окремих об'єктів і їхніх груп однаково**, ніби це одне й те саме. **Ключове:** Composite вводить спільний інтерфейс для всіх елементів дерева, тому клієнт працює з ними однаково, не зважаючи на те, з чого вони складаються.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняПатерн **Composite (Компонувальник)** вирішує проблему **роботи з ієрархічними структурами об'єктів**: він дозволяє **звертатися до окремих об'єктів і їхніх груп однаково**, ніби це одне й те саме. --- ### 1. **Суть проблеми** У багатьох системах об'єкти утворюють **деревоподібні структури**: наприклад, файли і папки, елементи інтерфейсу, організаційні підрозділи. Клієнтському коду незручно розрізняти: де *лист* (одиничний об'єкт), а де *контейнер* (складовий об'єкт). Без патерну доводиться писати різний код для обробки кожного випадку: ```java if (obj instanceof Folder) { ... } else if (obj instanceof File) { ... } ``` Це порушує принцип **відкритості/закритості** і робить код негнучким. --- ### 2. **Що робить Composite** Composite вводить **спільний інтерфейс для всіх елементів дерева** (і простих, і складових). Тепер клієнт працює з ними **однаково**, не переймаючись тим, з чого вони складаються. --- ### 3. **Як це виглядає** - **Component** - спільний інтерфейс для всіх елементів (наприклад, `render()`, `getSize()`). - **Leaf (Лист)** - елемент без дочірніх об'єктів (наприклад, файл). - **Composite (Контейнер)** - елемент, який містить інші `Component` і реалізує їхні методи, **делегуючи операції дітям**. **Приклад (Java):** ```java interface Graphic { void draw(); } class Dot implements Graphic { public void draw() { System.out.println("Draw dot"); } } class CompoundGraphic implements Graphic { private List<Graphic> children = new ArrayList<>(); public void add(Graphic child) { children.add(child); } public void draw() { for (Graphic g : children) g.draw(); } } ``` Тепер клієнт може викликати: ```java Graphic group = new CompoundGraphic(); group.add(new Dot()); group.add(new Dot()); group.draw(); // Малює і групу, і точки, однаково ``` --- ### 4. **Проблема, яку він вирішує** Composite усуває необхідність розрізняти **"одиничні" та "складові"** об'єкти. Він дозволяє: - звертатися до дерева об'єктів через **єдиний інтерфейс**; - **обробляти все однаково**, незалежно від структури; - легко додавати нові типи елементів без зміни клієнтського коду. --- ### 5. **Висновок** Патерн **Компонувальник** вирішує проблему **керування ієрархічними об'єктами**, забезпечуючи **єдиний інтерфейс взаємодії** для елементів та їхніх груп. Підсумок - код стає **простим, розширюваним і незалежним від структури дерева**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.