Объединяйте объекты в древовидные структуры для представления иерархий частей и целых. Composite позволяет клиентам единообразно обрабатывать отдельные объекты и композиции объектов.
- Компонент: объявляет интерфейс для объектов в композиции. Реализует поведение по умолчанию для интерфейса, общего для всех классов, в зависимости от обстоятельств. Объявляет интерфейс для доступа к его дочерним компонентам и управления ими. (необязательно) определяет интерфейс для доступа к родительскому компоненту в рекурсивной структуре и реализует его, если это уместно.
- Лист: представляет листовые объекты в композиции. У листа нет детей. Определяет поведение для примитивных объектов в композиции.
- Составной: определяет поведение для компонентов, имеющих дочерние элементы. Хранит дочерние компоненты. Реализует дочерние операции, связанные с интерфейсом компонента.
- Клиент: управляет объектами в композиции через интерфейс компонента.
public class Main {
public static void main(String[] args) {
// Create a tree structure
Composite root = new Composite("root");
root.add(new Leaf("Leaf A"));
root.add(new Leaf("Leaf B"));
Composite comp = new Composite("Composite X");
comp.add(new Leaf("Leaf XA"));
comp.add(new Leaf("Leaf XB"));
root.add(comp);
root.add(new Leaf("Leaf C"));
// Add and remove a leaf
Leaf leaf = new Leaf("Leaf D");
root.add(leaf);
root.remove(leaf);
// Recursively display tree
root.display(1);
}
}
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
public abstract void add(Component c);
public abstract void remove(Component c);
public abstract void display(int depth);
}
public class Composite extends Component {
private List children = new ArrayList<>();
public Composite(String name) {
super(name);
}
@Override
public void add(Component component) {
children.add(component);
}
@Override
public void remove(Component component) {
children.remove(component);
}
@Override
public void display(int depth) {
System.out.println("-".repeat(depth) + name);
for (Component component : children) {
component.display(depth + 2);
}
}
}
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void add(Component c) {
System.out.println("Cannot add to a leaf");
}
@Override
public void remove(Component c) {
System.out.println("Cannot remove from a leaf");
}
@Override
public void display(int depth) {
System.out.println("-".repeat(depth) + name);
}
}
-root ---Leaf A ---Leaf B ---Composite X -----Leaf XA -----Leaf XB ---Leaf C
eidherjulian61/дизайн-шаблоны
Основные шаблоны Проектирования
ид ・ 27 сентября ・ 1 минута чтения
Оригинал: “https://dev.to/eidher/composite-pattern-1an7”