객체들의 관계를 트리구조로 구성하여 부분-전체 계층을 표현하는 패턴.
사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 함.
클라이언트는 전체-부분 구분없이 동일한 인터페이스 사용 가능 -> 일괄적인 관리가 가능해짐
- 구체적인 부분
- 즉 Leaf 클래스와 전체에 해당하는 Composite 클래스에 공통 인터페이스를 정의
- 구체적인 부분 클래스
- Composite 객체의 부품으로 설정
- 전체 클래스
- 복수 개의 Component를 갖도록 정의
- 그러므로 복수 개의 Leaf, 심지어 복수 개의 Composite 객체를 부분으로 가질 수 있음
Shape 인터페이스 내에 각각 도형마다 색을 입히는 draw() 메소드를 정의하는 예제
// Shape.java
public interface Shape {
public void draw(String fillColor);
}
Leaf 객체들은 복합체에 포함되는 요소
// Triangle.java
public class Triangle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Triangle with color "+fillColor);
}
}
// Circle.java
public class Circle implements Shape {
@Override
public void draw(String fillColor) {
System.out.println("Drawing Circle with color "+fillColor);
}
}
// Drawing.java
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
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");
List<Shape> shapes = new ArrayList<>();
shapes.add(drawing);
shapes.add(new Triangle());
shapes.add(new Circle());
for(Shape shape : shapes) {
shape.draw("Green");
}
}
}
Drawing Triangle with color Red
Drawing Triangle with color Red
Drawing Circle with color Red
Drawing Triangle with color Green
Drawing Triangle with color Green
Drawing Circle with color Green
Drawing Triangle with color Green
Drawing Circle with color Green