Яку проблему вирішує патерн «Компонувальник»?
Патерн Composite (Компонувальник) вирішує проблему роботи з ієрархічними структурами об'єктів: він дозволяє звертатися до окремих об'єктів і їхніх груп однаково, ніби це одне й те саме.
1. Суть проблеми
У багатьох системах об'єкти утворюють деревоподібні структури: наприклад, файли і папки, елементи інтерфейсу, організаційні підрозділи. Клієнтському коду незручно розрізняти: де лист (одиничний об'єкт), а де контейнер (складовий об'єкт). Без патерну доводиться писати різний код для обробки кожного випадку:
if (obj instanceof Folder) { ... } else if (obj instanceof File) { ... }Це порушує принцип відкритості/закритості і робить код негнучким.
2. Що робить Composite
Composite вводить спільний інтерфейс для всіх елементів дерева (і простих, і складових). Тепер клієнт працює з ними однаково, не переймаючись тим, з чого вони складаються.
3. Як це виглядає
- Component - спільний інтерфейс для всіх елементів (наприклад,
render(),getSize()). - Leaf (Лист) - елемент без дочірніх об'єктів (наприклад, файл).
- Composite (Контейнер) - елемент, який містить інші
Componentі реалізує їхні методи, делегуючи операції дітям.
Приклад (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();
}
}Тепер клієнт може викликати:
Graphic group = new CompoundGraphic();
group.add(new Dot());
group.add(new Dot());
group.draw(); // Малює і групу, і точки, однаково4. Проблема, яку він вирішує
Composite усуває необхідність розрізняти "одиничні" та "складові" об'єкти. Він дозволяє:
- звертатися до дерева об'єктів через єдиний інтерфейс;
- обробляти все однаково, незалежно від структури;
- легко додавати нові типи елементів без зміни клієнтського коду.
5. Висновок
Патерн Компонувальник вирішує проблему керування ієрархічними об'єктами, забезпечуючи єдиний інтерфейс взаємодії для елементів та їхніх груп. Підсумок - код стає простим, розширюваним і незалежним від структури дерева.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.