ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [디자인패턴] 컴포지트 패턴 (Composite Pattern)
    IT, 프로그래밍/Design Patterns 2019. 1. 9. 21:41


    컴포지트 패턴 (Composite Pattern) = 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층 구조로 표현하는 것. 클리이언트에서 개밸 객체와 다른 객체들로 구성된 복합 객체(Composite)를 똑같은 방법으로 다룰 수 있음. 


    Component (Interface) : 복합 객체내에 들어있는 모든 객체들에 대한 인터페이스를 제공합니다. 복합노드, 리프노드에 대한 메소드를 정의함. 

    Leaf : 그 안에 들어있는 원소에 대한 행동을 정의.

    Composite (=복합객체) : 자식이 있는 구성요소의 행동을 정의하고 자식 구성요소를 저장하는 역할을 맡음. 

    Client : Component 인터페이스를 사용해 복합 객체 내의 객체들을 조작할 수 있음.



    Composite = Composite + Leaf. 즉 재귀적인(reculsive) 요소를 가지고 있습니다.


     

    이 말은 다음 단계를 탐색하면서 하위 노드의 탐색이 끝나면 다시 자기자신으로 돌아옴을 뜻합니다.  

    이런 특성을 가지고 있으므로 하나의 인터페이스를 통해 서로 다른 종류의 하위 노드에 접근 할 수 있다면, 탐색시에 많은 편리함을 느낄 수 있습니다.


    이 디자인패턴은 어디에 사용이 가능할까요?


    DOM(Document Object Model) 같은 경우에, 자식이 없는 Leaf와 다른 구성요소를 포함하고 있는 노드로 나누어 집니다. 이런 경우 Document 같은 인터페이스를 선언하여 구현하게 하면 재귀적인 탐색이 가능합니다.


    파일시스템 또한 아무것도 없는 Leaf인 File과, File과 Directory를 포함하는 복합 객체로 나타낼 수 있습니다.

    awt composite에 대한 이미지 검색결과


    자료출처 : https://softwareengineering.stackexchange.com/questions/264062/query-on-recursive-composition


    자바에서는 awt 패키지가 컴포지트 패턴으로 작성되어 있습니다. 최상위 부모인 Component에서 Container 객체를 가지고 구성관계를 이루고 있습니다.


    Container에는 Component 들을 가질 수 있는 복합 객체로 구성이 되어 있습니다.

    그 Component들은 복합 객체가 될 수도, 자식이 없는 Leaf가 될 수도 있습니다.



    Component 타입으로 묶어주었기 때문에 하위에 있는 요소가 다른 복합요소를 포함하는지, 아니면 혼자 있는 Leaf인지는 사용자 입장에서는 알 필요가 없고, if문이나 instanceof 등으로 일일이 검사할 필요가 없습니다. 




    탐색은 각 복합객체마다 iterator를 사용하여 순환토록하고, stack을 사용한 순회를 사용하여 구현합니다. 



Designed by Tistory.