단일 객체와 그 객체들을 가지는 집합 객체를 같은 타입으로 취금해, 트리 구조로 객체들을 엮어
전체-부분(whole-part)
계층을 표현하는 패턴
사용자로 하여금 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있다
객체들이 모두 같은 타입으로 취급되어 새로운 클래스 추가가 용이하다
트리 구조를 다룰 때, 개발자 리프 노드와 브랜치를 구별해야한다.
여기서 코드는 많은 복잡성을 만들어 많은 에러를 초래한다.
이를 해결하기 위해, 복잡하고 원시적인 객체를 구분하지 않고 동일하게 취급하기 위한 인터페이스를 작성할 수 있다
Component
Leaf
Composite
draw()
public interface Shape {
public void draw(String paintColor);
}
// Triangle.java
public class Triangle implements Shape {
public void draw(String paintColor) {
System.out.println("삼각형이 다음 색상으로 색칠되었습니다. : " + paintColor);
}
}
// Square.java
public class Square implements Shape {
public void draw(String paintColor) {
System.out.println("사각형이 다음 색상으로 색칠되었습니다. : " + paintColor);
}
}
// Circle.java
public class Circle implements Shape {
public void draw(String paintColor) {
System.out.println("동그라미가 다음 색상으로 색칠되었습니다. : " + paintColor);
}
}
public class Drawing implements Shape {
// 도형들
private List<Shape> shapes = new ArrayList<>();
@Override
public void draw(String paintColor) {
for(Shape shape : shapes) {
shape.draw(paintColor);
}
}
public void add(Shape s) {
this.shapes.add(s);
]
public void remove(Shape s) {
this.shapes.remove(s);
}
public void clear() {
System.out.println("모든 도형을 제거합니다.");
this.shapes.clear();
}
}
public class CompositePattern {
public static void main(String args[]) {
Shape triangle = new Triangle();
Shape circle = new Circle();
Shape square = new Square();
Drawing drawing = new Drawing();
drawing.add(triangle);
drawing.add(circle);
drawing.add(square);
drawing.draw("빨간색");
}
}
https://dailyheumsi.tistory.com/193
https://velog.io/@newtownboy/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%EC%BB%B4%ED%8D%BC%EC%A7%80%ED%8A%B8%ED%8C%A8%ED%84%B4Composite-Pattern
https://johngrib.github.io/wiki/pattern/composite/
https://mygumi.tistory.com/343