본문 바로가기

Design/Design Pattern

[Design Pattern] Composite Pattern

이번 장에서는 컴포지트(Composite) 패턴에 대해서 알아보도록 한다.
샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다.


컴포지트 패턴이란?
위키백과에 따르면 아래와 같이 정의되어 있다.

객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.

쉬운 예시로 PC에서 Folder와 File이 있다.
이번에 필자가 예시로 사용할 것도 Java의 Package와 Java File이다.


GoF Design Pattern에 따르면 아래와 같은 Class Diagram이 그려진다.

Component: 구현체인 Leaf와 Composite의 추상 클래스
Leaf, Component: Component의 구현체

위의 구조를 Java의 Package와 Java File에 적용시키면 아래와 같은 그림이 된다.

Component는 Component를 소유할 수 있으며 이는 JavaFile이 될 수도 Package가 될 수도 있다.

이번에 필자가 구현할 Package 구조는 이전 글에서 다루었던 Bridge 패턴의 Package구조다.
Bridge 패턴을 몰라도 상관없다. 단지 "저런 구조를 만드는구나" 정도만 이해하고 넘어가면 된다.


코드를 보면서 하나씩 살펴보도록 한다.

Component Class
JavaFile과 Package의 추상 클래스로 이름(name)을 가지고 생성된다.

JavaFile Class
Component의 구현체로 FileType과 이름을 속성으로 가지고 있다.

Package Class
Component의 구현체로 Component 리스트를 가지고 있다.

Tester Class
Package와 JavaFile을 만들어서 Package 구조를 생성할 클래스
Package 구조를 생성하고 printComponent 메서드에 root Package를 전달한다.
printComponent는 모든 Package의 내용물을 출력할 때까지 재귀한다.

코드를 실행시킨 결과는 아래와 같다.
위에서 필자가 만들겠다고 했던 Bridge 패턴의 디렉토리 구조와 동일한 것을 확인할 수 있다.


지금까지 Java의 Package와 JavaFile을 주제로 컴포지트 패턴에 대해서 알아보았다.

'Design > Design Pattern' 카테고리의 다른 글

[Design Pattern] Visitor Pattern  (0) 2022.02.02
[Design Pattern] Decorator Pattern  (0) 2022.02.02
[Design Pattern] Bridge Pattern  (0) 2022.02.02
[Design Pattern] Abstract Factory Pattern  (0) 2022.02.01
[Design Pattern] Builder Pattern  (0) 2022.02.01