////
Search
🌲

Composite pattern(컴포지트 패턴)

컴포지트 패턴이란? 위키백과
객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다. 특징
트리 형태
복합 객체와 단일 객체를 동일한 방법으로 다룬다.
만약 아래와 같은 반복자 패턴에서 만든 슈퍼 프린터가 더 발전했다. 기존 슈퍼 프린터에는 실물로 된 책, 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 적용 후

컴포지트 패턴 이해하기

컴포지트 패턴이란? 위키백과
객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
복합체(책)와 단일 객체(페이지)는 동일한 인터페이스를 구현하고 있구나. 특징
트리 형태
책 내부에 종이가 존재하는 구조구나, 그래서 트리 형태구나.
복합 객체와 단일 객체를 동일한 방법으로 다룬다.
동일한 Component를 구현하고 있기 때문에 print() 하나로도 동일한 방법으로 다룰 수 있구나.
Componet - Component Interface
Leaf - Page들 - PDF를 받을 수도, 종이를 받을 수 있음
Composite - 책(모던자바인액션) 내부에 추가 찾기 등이 존재

재미있는 점

컴포지트 패턴은 뭔가 우리가 코드를 칠 때 많이 사용해본 듯 한 느낌을 받는다. 이는 재귀와 코드가 비슷하기 때문인 것 같다.