자바에서의 복합 디자인 패턴

Composite 패턴은 구조적 디자인 패턴 중 하나입니다. Composite 디자인 패턴은 부분-전체 계층구조를 나타내어야 할 때 사용됩니다.

Composite 디자인 패턴

객체를 구조적으로 표현해야 할 때, 객체들이 동일한 방식으로 처리되어야 하는 경우 Composite 디자인 패턴을 적용할 수 있습니다. 실생활 예시로 살펴보겠습니다 – 도표는 원, 선, 삼각형 등과 같은 객체로 구성된 구조입니다. 도혐을 색으로 채우면 (예: 빨간색), 도형 안의 객체에도 동일한 색상이 적용됩니다. 여기서 도표는 여러 부분으로 이루어져 있고 모두 동일한 작업을 갖고 있습니다. Composite 패턴에는 다음과 같은 객체가 포함되어 있습니다.

  1. 기본 구성 요소 – 기본 구성 요소는 구성 안의 모든 객체에 대한 인터페이스입니다. 클라이언트 프로그램은 기본 구성 요소를 사용하여 구성 안의 객체와 작업할 수 있습니다. 이것은 인터페이스이거나 모든 객체에 공통된 몇 가지 메서드를 갖는 추상 클래스 일 수 있습니다.
  2. 리프 – 구성 요소의 동작을 정의합니다. 이것은 구성의 기본 구성 요소이며 기본 구성 요소를 구현합니다. 다른 구성 요소에 대한 참조가 없습니다.
  3. 컴포지트 – 리프 요소로 이루어지며 기본 구성 요소의 작업을 구현합니다.

여기서는 드로잉 시나리오에 컴포지트 디자인 패턴을 적용하고 있습니다.

컴포지트 패턴 기본 구성 요소

컴포지트 패턴 기본 구성 요소는 리프와 컴포지트에 대한 공통 메서드를 정의합니다. 우리는 주어진 색상으로 모양을 그리는 메서드 draw(String fillColor)를 가진 Shape 클래스를 생성할 수 있습니다. 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)은 자바에서 합성 패턴의 훌륭한 예시이며 Swing에서 많이 사용됩니다. 이전 구조적 디자인 패턴에 관한 기사들은 다음과 같습니다:

Source:
https://www.digitalocean.com/community/tutorials/composite-design-pattern-in-java