디자인 패턴

Composite Pattern - 구조

iksadnorth 2023. 7. 30. 15:52

👣 문제 상황

코드 가독성과 유지보수성을 높이기 위해
개별 객체와 집합 객체를 동일하게 다루고 싶은 경우가 존재한다.

예를 들어, 포토샵과 같은 프로그램을 설계한다고 가정해본다.
개별 도형들에 '파랑색으로 색칠하기' 기능을 적용할 때,
각 도형을 그룹으로 묶은 집합 도형에도 '파랑색으로 색칠하기' 기능을 적용할 수 있어야
프로그램 사용자가 '각 도형 색칠하기'와 '묶인 도형 색칠하기'라는 2 개의 버튼을 사용하지 않고
'색칠하기' 버튼 1개로 작업을 진행할 수 있다.

목적 : 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 하고 싶을 때

👣 해결 방법

/** "Component" */
interface Graphic {
    public void print();
}

/** "Composite" */
class Shapes implements Graphic {
    private List<Graphic> mChildGraphics = new ArrayList<Graphic>();

    public void print() {
        for (Graphic graphic : mChildGraphics) {
            graphic.print();
        }
    }

    public void add(Graphic graphic) {
        mChildGraphics.add(graphic);
    }
}

/** "Leaf" */
class Ellipse implements Graphic {
    public void print() {
        System.out.println("Blue");
    }
}

/** Client */
public class Program {
    public static void main(String[] args) {
        Ellipse ellipse1 = new Ellipse();
        Ellipse ellipse2 = new Ellipse();
        Ellipse ellipse3 = new Ellipse();
        Ellipse ellipse4 = new Ellipse();

        CompositeGraphic graphic = new CompositeGraphic();

        graphic.add(graphic1);
        graphic.add(graphic2);
        graphic.add(graphic3);
        graphic.add(graphic4);

        graphic.print();
    }
}

 

'디자인 패턴' 카테고리의 다른 글

컴포지트 패턴 적용 - SecurityFilterChain 적용  (0) 2023.08.30
Facade Pattern - 구조  (0) 2023.07.30
객체 지향 프로그래밍  (0) 2023.07.21
Programming Paradigm  (0) 2023.07.19
MVC Pattern - 아키텍쳐  (0) 2023.07.19