Автор оригинала: Pankaj Kumar.
Композитный шаблон является одним из структурных шаблонов проектирования. Составной шаблон проектирования используется, когда нам нужно представить иерархию “часть-целое”.
Композитный Шаблон Дизайна
Когда нам нужно создать структуру таким образом, чтобы объекты в структуре обрабатывались одинаково, мы можем применить составной шаблон проектирования.
Давайте разберемся в этом на примере реальной жизни – Диаграмма-это структура, состоящая из таких объектов, как Круг, Линии, Треугольник и т.д. Когда мы заливаем рисунок цветом (скажем, красным), тот же цвет также применяется к объектам на чертеже. Здесь рисунок состоит из разных частей, и все они выполняют одни и те же операции.
Составной шаблон состоит из следующих объектов.
- Базовый компонент – Базовый компонент является интерфейсом для всех объектов в композиции, клиентская программа использует базовый компонент для работы с объектами в композиции. Это может быть интерфейс или абстрактный класс с некоторыми методами, общими для всех объектов.
- Лист – Определяет поведение элементов в композиции. Это строительный блок для композиции и реализует базовый компонент. В нем нет ссылок на другие компоненты.
- Составной – Он состоит из листовых элементов и реализует операции в базовом компоненте.
Здесь я применяю составной шаблон проектирования для сценария рисования.
Базовый Компонент Композитного Рисунка
Базовый компонент композитного рисунка определяет общие методы для листа и композитов. Мы можем создать класс Shape
с помощью метода draw(String fillColor)
, чтобы нарисовать фигуру заданным цветом.
Базовый компонент композитного рисунка определяет общие методы для листа и композитов. Мы можем создать класс || Shape || с помощью метода || draw(String fillColor)||, чтобы нарисовать фигуру заданным цветом.
package com.journaldev.design.composite; public interface Shape { public void draw(String fillColor); }
Композитный Шаблон Дизайна Листовые Объекты
Лист шаблона композитного дизайна реализует базовый компонент, и они являются строительным блоком для композита. Мы можем создавать несколько листовых объектов, таких как треугольник, Круг и т.д.
Лист шаблона композитного дизайна реализует базовый компонент, и они являются строительным блоком для композита. Мы можем создавать несколько листовых объектов, таких как треугольник, Круг и т.д.
package com.journaldev.design.composite; public class Triangle implements Shape { @Override public void draw(String fillColor) { System.out.println("Drawing Triangle with color "+fillColor); } }
Лист шаблона композитного дизайна реализует базовый компонент, и они являются строительным блоком для композита. Мы можем создавать несколько листовых объектов, таких как треугольник, Круг и т.д.
package com.journaldev.design.composite; public class Circle implements Shape { @Override public void draw(String fillColor) { System.out.println("Drawing Circle with color "+fillColor); } }
Составной объект
Составной объект содержит группу конечных объектов, и мы должны предоставить некоторые вспомогательные методы для добавления или удаления конечных объектов из группы. Мы также можем предоставить метод удаления всех элементов из группы.
Составной объект содержит группу конечных объектов, и мы должны предоставить некоторые вспомогательные методы для добавления или удаления конечных объектов из группы. Мы также можем предоставить метод удаления всех элементов из группы.
package com.journaldev.design.composite; import java.util.ArrayList; import java.util.List; public class Drawing implements Shape{ //collection of Shapes private Listshapes = new ArrayList (); @Override public void draw(String fillColor) { for(Shape sh : shapes) { sh.draw(fillColor); } } //adding shape to drawing public void add(Shape s){ this.shapes.add(s); } //removing shape from drawing public void remove(Shape s){ shapes.remove(s); } //removing all the shapes public void clear(){ System.out.println("Clearing all the shapes from drawing"); this.shapes.clear(); } }
Обратите внимание, что composite также реализует компонент и ведет себя аналогично листу, за исключением того, что он может содержать группу листовых элементов.
Наша реализация составного шаблона готова, и мы можем протестировать ее с помощью клиентской программы.
Клиентская программа Составного Шаблона Проектирования
Клиентская программа Составного Шаблона Проектирования
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(компонент)
является отличным примером составного шаблона в java и часто используется в Swing.
Более ранние статьи по структурному дизайну:
- Шаблон моста в Java
- Шаблон проектирования адаптера в Java