컴포지트 패턴(Composite pattern)이란?
객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴
이런식으로 재귀적 호출이 일어나는 편이다.
예를 들어 만약 전체 파일 size를 알고 싶다면, Leaf 노드에 있는 getSize함수를 계속해서 호출해 전체 값을 알 수 있다.
이런 식으로 자기 자신이 계속 호출되는 원리이다.
이 패턴을 쓸 때 노드의 개념을 사용한다는 것이 인상깊었다.
예제 soure file >>
연습문제
11-1) 파일 시스템 이외에 Composite 패턴이 적용되는 예를 생각해보십시오.
- HTML의 리스트(ul, ol, dl) 과 테이블 등
- Swing
11-2) 예제 프로그램에 Entry의 (하위 클래스의) 인스턴스에서 '풀 패스'를 얻는 기능을 추가하려고 합니다.
예를 들어서, File의 인스턴스에서
"/root/usr/Kim/Composite.java"
라는 문자열을 얻으려고 합니다. 이때 예제 프로그램의 어떤 클래스를 어떻게 변경하면 좋을까요?
public abstract class Entry {
protected Entry parent;
...
File file = new File("Composite.java", 100); youngjin.add(file);
rootdir.printList();
public String getFullName() {
StringBuffer fullname = new StringBuffer(); Entry entry = this;
do {
System.out.println("");
System.out.println("file = " + file.getFullName()); System.out.println("youngjin = " + youngjin.getFullName());
fullname.insert(0, "/" + entry.getName());
...
entry = entry.parent;
} while (entry != null);
return fullname.toString();
}
}
public class Directory extends Entry {
...
public Entry add(Entry entry) {
directory.add(entry);
entry.parent = this;
return this;
}
}
Composite Pattern in Java API
- java.awt.Container#add(Component) (practically all over Swing components)
- javax.faces.component.UIComponent#getChildren() (practically all over JSF UI components)
'JAVA' 카테고리의 다른 글
[디자인패턴] façade 패턴 (0) | 2022.05.12 |
---|---|
[디자인패턴] Decorator 패턴 (0) | 2022.04.28 |
[디자인패턴] 전략 패턴(Strategy Pattern) (0) | 2022.04.07 |
[디자인패턴] Prototype - 복사해서 인스턴스 만들기 (0) | 2022.03.31 |
[디자인패턴] Singleton (0) | 2022.03.21 |