Skip to main content

Яку проблему вирішує патерн «Компонувальник»?

Патерн 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. Висновок

Патерн Компонувальник вирішує проблему керування ієрархічними об'єктами, забезпечуючи єдиний інтерфейс взаємодії для елементів та їхніх груп. Підсумок - код стає простим, розширюваним і незалежним від структури дерева.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.