Шаблон “Композит” – это один из структурных шаблонов проектирования. Шаблон проектирования “Композит” используется, когда нам нужно представить иерархию часть-целое.
Шаблон проектирования “Композит”
Когда нам нужно создать структуру таким образом, чтобы объекты в структуре обрабатывались одинаково, мы можем применить шаблон проектирования “Композит”. Давайте разберем это на примере из реальной жизни – диаграмма представляет собой структуру, состоящую из объектов, таких как круги, линии, треугольники и т. д. Когда мы заполняем рисунок цветом (скажем, красным), тот же цвет также применяется к объектам на рисунке. Здесь рисунок состоит из разных частей, и все они имеют одинаковые операции. Шаблон “Композит” включает в себя следующие объекты.
- Базовый компонент – Базовый компонент представляет собой интерфейс для всех объектов в композиции, клиентская программа использует базовый компонент для работы с объектами в композиции. Это может быть интерфейс или абстрактный класс с некоторыми методами, общими для всех объектов.
- Лист – Определяет поведение элементов в композиции. Это строительный блок для композиции и реализует базовый компонент. Он не имеет ссылок на другие компоненты.
- Композит – Состоит из листовых элементов и реализует операции в базовом компоненте.
Здесь я применяю шаблон компоновщика для сценария рисования.
Базовый компонент композиционного шаблона
Базовый компонент шаблона композиции определяет общие методы для листьев и композитов. Мы можем создать класс Shape
с методом draw(String fillColor)
для рисования фигуры с заданным цветом. Shape.java
package com.journaldev.design.composite;
public interface Shape {
public void draw(String fillColor);
}
Объекты листьев шаблона проектирования композит
Листовой элемент шаблона проектирования композита реализует базовый компонент, и они являются строительными блоками для композита. Мы можем создать несколько объектов листьев, таких как Треугольник, Круг и т. д. Triangle.java
package com.journaldev.design.composite;
public class Triangle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Triangle with color "+fillColor);
}
}
Circle.java
package com.journaldev.design.composite;
public class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Circle with color "+fillColor);
}
}
Композитный объект
A composite object contains group of leaf objects and we should provide some helper methods to add or delete leafs from the group. We can also provide a method to remove all the elements from the group. Drawing.java
package com.journaldev.design.composite;
import java.util.ArrayList;
import java.util.List;
public class Drawing implements Shape{
//коллекция форм
private List shapes = new ArrayList();
@Override
public void draw(String fillColor) {
for(Shape sh : shapes)
{
sh.draw(fillColor);
}
}
//добавление формы к рисованию
public void add(Shape s){
this.shapes.add(s);
}
//удаление формы из рисования
public void remove(Shape s){
shapes.remove(s);
}
//удаление всех форм
public void clear(){
System.out.println("Clearing all the shapes from drawing");
this.shapes.clear();
}
}
Обратите внимание, что композит также реализует компонент и ведет себя аналогично листу, за исключением того, что он может содержать группу листовых элементов. Наша реализация композитного шаблона готова, и мы можем протестировать её с клиентской программой.
Программа клиента для шаблона “Композит”
TestCompositePattern.java
package com.journaldev.design.test;
import com.journaldev.design.composite.Circle;
import com.journaldev.design.composite.Drawing;
import com.journaldev.design.composite.Shape;
import com.journaldev.design.composite.Triangle;
public class TestCompositePattern {
public static void main(String[] args) {
Shape tri = new Triangle();
Shape tri1 = new Triangle();
Shape cir = new Circle();
Drawing drawing = new Drawing();
drawing.add(tri1);
drawing.add(tri1);
drawing.add(cir);
drawing.draw("Red");
drawing.clear();
drawing.add(tri);
drawing.add(cir);
drawing.draw("Green");
}
}
Вывод вышеуказанной клиентской программы шаблона “Композит” следующий:
Drawing Triangle with color Red
Drawing Triangle with color Red
Drawing Circle with color Red
Clearing all the shapes from drawing
Drawing Triangle with color Green
Drawing Circle with color Green
Важные моменты шаблона “Композит”
- Шаблон “Композит” следует применять только тогда, когда группа объектов должна вести себя как один объект.
- Шаблон композитного дизайна можно использовать для создания структуры, подобной дереву.
java.awt.Container#add(Component)
– отличный пример композитного шаблона в Java и широко используется в библиотеке Swing. Ранее в статьях о структурных шаблонах дизайна:
Source:
https://www.digitalocean.com/community/tutorials/composite-design-pattern-in-java