이미 존재하는 오브젝트들과 이들을 그룹으로 묶고 있는 Comosite 객체가 있을때
가각의 오브젝트나 그룹을 묶고 있는 Comoposite 객체를 동일한 방법으로 사용하려고 하는 패턴
그룹별로 묶여 있는 상황에서 A,B,C 를 묶고 있는 어떤 composite 가 A 를 제외한 B,C 만 묶고자 한다
how?
상위 composite 에서 둘로 나누어 다시 composite 을 한다 A 를 갖는 composite 을 사이에 하나 두고
B,C 는 기존 A,B,C 를 갖고 있던 composite 가 원래 상위 composite 와 자신과의 중간단계의 composite 를 두어서
중간단계가 자신의 composite 에 포함되게 한다
각 노드의 부모로 가려면?
방법 :. 각 노드의 부모 객체를 찾게 하기 위해서 부모의 포인터를 갖게 한다
이러면 루트노드에서 본다면 루트노드의 자식이 많아질 수록 루트의 포인터 개수 또많 비례하게 생성되야 한다
----------------------------------------------------------
부모 노드를 가질때는
같은 레벨의 오브젝트는 자신을 포함하는 composite 의 포인터를 갖지고 있고
같은 레벨의 composite 가 부모 포인터를 가지고 있는 형식
----------------------------------------------------------
그렇다면 이럴 해결하기 위한 방법은?
방법 : 루트에 대한 첫번째 차일드는 최소 1개다
루트는 첫번째 차일드만 가지고 있고 첫번째 차일드는 자신의 자식과 동등한 레벨의 포인터를 가지고 있는 형태로 구성
이렇게 하면 첫번째를 통해서 같은 레벨의 끝까지 가려면 곧바로 내려 가는 것보다는 시간이 좀 걸릴 수 있다 (상황에 따라)
부모의 자식은 오브젝틀르 묶고 있는 composite 를 자식으로 설정한다
이 방법은 차일드 간의 순서가 있는 경우 이러한 연결이 유리하다
( B-Tree, B+ tree 등 소팅 되어야 할경우 )
composite 패턴이 기본적으로 트리 형태가 된다
Tip : 환원적인 데이터구조 형태는 잘 쓰지 않는다 , 별로 않좋다 , 환원적이지 않으면서 복합적인 형태를 다를 수 있는 것이 트리 형태
( 사이클이 없는 솔루션이 좋다 )
각 노드를 하나씩 지나가는 것은 iterator 패턴을 활용
leaf node(마지막 노드) 의 경우 공유할 가능성이 높다
flyweight 패턴으로 이를 해결 한다
그룹을 갖고 있는 composite 객체는 다른 오브젝트를 추가 하거나 제거 할 수 있지만
composite 에 추가 되어 있는 leafnode 는 추가하거나 삭제하는 일이 벌어진다면
에러가 난다 ( 만약 leafnode가 add ,remove 함수를 composite 처럼 갖고 있지 않다면 )
how?
모든 노드가 add, remove 함수를 갖게 하고 compoiste 일때만 add, remove 를 정의 해주고
일반 노드인 경우(클래스) 아무일도 않하면 된다
그래서 상위 클래스의 public 은 하위 노드에서 모두 갖게 해야 한다( 그것이 올바른 디자인 )
왜냐하면 composite 객체를 변경해야 하는 상황이 올 경우 동일한 인터페이스가 아니면
부모를 자식 composite 객체로 변경 시켜야 하는 상황이 종종 있는데 이때 위험을 앉고 다운 케스팅 해야 하는 상황이 올 수 있기 때문
공유되는 것의 소멸은 레퍼런스 카운트로 해결
DOM 구조
<table>
<th>
<td> </td>
</th>
</table>
이런 구조가 결국 트리인데 이것을 DOM 구조라 한다
동일한 인터페이스와 그룹으로 이루는 것들을 compoiste 패턴으로 다룰 수 있다
트리로 나오는 것은 거의다 composite 패턴으로 다룰 수 있다
'디자인패턴과방법론 > 디자인패턴' 카테고리의 다른 글
Facade 패턴 (0) | 2012.11.02 |
---|---|
Decorator(=wrapper) 패턴 (0) | 2012.11.02 |
Bridge 패턴 (0) | 2012.11.02 |
adapter 패턴 (0) | 2012.11.02 |
visitor 패턴 (0) | 2012.11.02 |