Поиск по сайту:

Составной шаблон проектирования в Java


Композитный шаблон — это один из структурных шаблонов проектирования. Составной шаблон проектирования используется, когда нам нужно представить иерархию часть-целое.

Составной шаблон проектирования

  1. Базовый компонент. Базовый компонент представляет собой интерфейс для всех объектов в композиции, клиентская программа использует базовый компонент для работы с объектами в композиции. Это может быть интерфейс или абстрактный класс с некоторыми общими для всех объектов методами.
  2. Листок — определяет поведение элементов в композиции. Он является строительным блоком для композиции и реализует базовый компонент. В нем нет ссылок на другие компоненты.
  3. Композитный — состоит из листовых элементов и реализует операции базового компонента.

Здесь я применяю составной шаблон проектирования для сценария рисования.

Базовый компонент составного массива

Базовый компонент составного шаблона определяет общие методы для листьев и композитов. Мы можем создать класс 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);
	}

}

Составной объект

Составной объект содержит группу конечных объектов, и мы должны предоставить некоторые вспомогательные методы для добавления или удаления листьев из группы. Мы также можем предоставить метод для удаления всех элементов из группы. Рисунок.java

package com.journaldev.design.composite;

import java.util.ArrayList;
import java.util.List;

public class Drawing implements Shape{

	//collection of Shapes
	private List<Shape> shapes = new ArrayList<Shape>();
	
	@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();
	}
}

Клиентская программа композитного шаблона проектирования

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) — отличный пример шаблона Composite в java, который часто используется в Swing. Более ранние статьи о шаблонах структурного проектирования:

  • Шаблон моста в Java
  • Шаблон проектирования адаптера в Java