컴포지트 패턴이란?
위키백과
객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
특징
•
트리 형태
•
복합 객체와 단일 객체를 동일한 방법으로 다룬다.
만약 아래와 같은 반복자 패턴에서 만든 슈퍼 프린터가 더 발전했다. 기존 슈퍼 프린터에는 실물로 된 책, PDF 등을 넣기만 하면 알아서 출력해주었다. 하지만 이제는 사용자가 특정 형태로 만들어 넣어주기만 하면 그 어떠한 자료도 출력이 된다.
기존 방식과 새로운 슈퍼 프린터 방식
기존 방식과 새로운 슈퍼 프린터의 가장 큰 차이점은 출력 방법에 있다. 기존에 책을 출력하기 위해서는 새로운 메서드 즉, printBook(), print() 두 가지의 메서드가 있었다. 하지만 새로운 방식에서는 print() 하나만 존재한다. 책과 종이를 출력하는 방식은 모두 동일하다.
public void printBook(){ ...} // 책 출력
public void print(Iterator<String> iterator){...} // 내부 라인 출력
Java
복사
컴포지트 패턴을 적용한 후
기존에 책을 넣을 때는 책에 대한 bookPrint()를 실행, 종이는 종이에 대한 print()를 실행했다. 하지만 지금은 동일한 방법을 가지고 두 가지를 출력할 수 있다. 기존 방식과의 가장 큰 차이점은 종이로 된 페이지를 넣고 출력할 때도 print() 만 호출하면 된다. 또한 책을 출력할 때도 print() 호출하면 된다.
public class Main {
public static void main(String[] args) {
Component modernJavaInAction = new ModernJavaInAction();
ModerJava3Page moderJava3Page = new ModerJava3Page();
modernJavaInAction.add(new ModerJava1Page());
modernJavaInAction.add(new ModerJava2Page());
modernJavaInAction.add(moderJava3Page);
modernJavaInAction.add(new PDFModerJava4Page());
SuperPrinter superPrinter = new SuperPrinter();
superPrinter.print(modernJavaInAction); // print하나로 얼마든지 책과 종이 둘다 처리 가능
System.out.println();
System.out.println("------- 3 페이지 따로 출력 -------");
superPrinter.print(moderJava3Page);
}
}
...
package composite.ex;
import composite.ex.component.Component;
public class SuperPrinter {
void print(Component composite){
composite.print();
}
}
Java
복사
composite 적용 후
컴포지트 패턴 이해하기
컴포지트 패턴이란?
위키백과
객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
•
트리 형태
•
복합 객체와 단일 객체를 동일한 방법으로 다룬다.
Componet - Component Interface
Leaf - Page들 - PDF를 받을 수도, 종이를 받을 수 있음
Composite - 책(모던자바인액션) 내부에 추가 찾기 등이 존재
재미있는 점
컴포지트 패턴은 뭔가 우리가 코드를 칠 때 많이 사용해본 듯 한 느낌을 받는다. 이는 재귀와 코드가 비슷하기 때문인 것 같다.