Note

[디자인패턴] Composite Pattern - 복합체 패턴

Supreme_YS 2021. 12. 17. 11:52

이름부터 아리송한 복합체 패턴(Composite Pattern)은 일괄적인 관리를 위해 고안된 패턴이다. 복합 개체와 단일 개체를 같은 방법으로 사용하고자 할 때 사용하는 패턴이다. 이게 무슨 말일까 ? 역시 추상화를 해보면 조금 이해하기 쉬울 듯 하다. 도형 삼각형, 사각형, 원을 그리고 삼각형과 사각형을 그룹화 지었다고 가정하자. 그렇다면 (삼각형, 사각형) / 원 이런식의 두 그룹으로 나뉘게 된다. 이제 이 도형들에게 색을 입힐 것인데 색을 입히는 행위는 그룹이 되어 있건 안되어 있건 하나의 버튼으로 동작하게 된다.

 

이처럼 하나의 객체처럼 동작하는 다수의 객체가 있는 경우에 적용이 가능하다. 이 말을 위의 예제에 빗대어 설명하자면 색을 칠하는 동작(하나의 객체처럼 동작)하는 삼각형, 사각형, 원(다수의 객체) 이렇게 대조해서 이해할 수 있을 것이다.

 

뭐, 학문적으로 접근하면 Base Component / Leaf / Composite 이렇게 세 부분으로 나뉘어서 구성을 하는데 Base Component는 공통 동작(하나의 객체처럼 동작) 메서드고, Leaf는 각 객체들(삼각형, 사각형, 원), Composite는 Leaf들을 컨트롤하는 역할을 하게 된다. 자, 이제 예제 코드를 보자

 

* Shape은 공통된 동작을 나타내는 draw 메서드를 가진 인터페이스로 Base Component! 

package DesignPattern.Composite;

// Shape 인터페이스 내에 각각 도형마다 색을 입히는 draw 메서드 정의
public interface Shape {
    public void draw(String fillColor);
}

* 이제 위의 그 동작들을 오버라이딩한 각 객체들 즉, 하나의 동작을 하는 것처럼 보이는 각 객체들. Leaf

package DesignPattern.Composite;

public class Circle implements Shape {

    @Override
    public void draw(String fillcolor) {
        System.out.println("Drawing Circle with color " + fillcolor);
    }
}

package DesignPattern.Composite;

public class Triangle implements Shape {

    @Override
    public void draw(String fillcolor) {
        System.out.println("Drawing Triangle with color " + fillcolor);
    }
}

* 그리고 이러한 객체 그룹인 Leaf들을 관리하는 Composite

package DesignPattern.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 shape : shapes) {
            shape.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();
    }
}

* 테스트 코드

package DesignPattern.Composite;

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

public class Client {
    public static void main(String[] args) {
        Shape tri = new Triangle();
        Shape tri1 = new Triangle();
        Shape cir = new Circle();

        Drawing drawing = new Drawing();
        drawing.add(tri);
        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