'JAVA 언어로 배우는 디자인 패턴 입문'의 내용을 정리한 것입니다.
Composite 패턴
- 디렉터리는 중첩된 구조, 재귀적인 구조를 만들어 낸다.
- 그릇과 내용물을 같은 종류로 취급하면 편리한 경우가 있다. 작은 그릇 안에 더 작은 그릇을 넣는 식으로 중첩된 구조, 재귀적인 구조를 만들 수 있다.
예제 프로그램
- 파일을 나타내는 File 클래스, 디렉터리를 나타내는 클래스인 Directory 클래스, 그 둘을 취합하는 상위 클래스인 Entry 클래스
Entry 클래스
public abstract class Entry {
public abstract String getName();
public abstract int getSize();
public void printList() {
printList("");
}
protected abstract void printList(String prefix);
@Override
public String toString() {
return getName() + " (" + getSize()+ ")";
}
}
File 클래스
public class File extends Entry {
private String name;
private int size;
public File(String name, int size) {
this.name = name;
this.size = size;
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
return size;
}
@Override
protected void printList(String prefix) {
System.out.println(prefix + "/" + this);
}
}
Directory 클래스
public class Directory extends Entry {
private String name;
private List<Entry> directory = new ArrayList<>();
public Directory(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
int size = 0;
for (Entry entry: directory) {
size += entry.getSize();
}
return size;
}
@Override
protected void printList(String prefix) {
System.out.println(prefix + "/" + this);
for (Entry entry: directory) {
entry.printList(prefix + "/" + name);
}
}
public Entry add(Entry entry) {
directory.add(entry);
return this;
}
}
Main 클래스
public class Main {
public static void main(String[] args) {
System.out.println("Making root entries...");
Directory rootdir = new Directory("root");
Directory bindir = new Directory("bin");
Directory tmpdir = new Directory("tmp");
Directory usrdir = new Directory("usr");
rootdir.add(bindir);
rootdir.add(tmpdir);
rootdir.add(usrdir);
bindir.add(new File("vi", 10000));
bindir.add(new File("latex", 20000));
rootdir.printList();
System.out.println();
}
}
실행 결과
Making root entries...
/root (30000)
/root/bin (30000)
/root/bin/vi (10000)
/root/bin/latex (20000)
/root/tmp (0)
/root/usr (0)
Leaf(잎) 역
- 내용물을 나타낸다. 이 안에는 다른 것을 넣을 수 없다.
- File 클래스가 이 역할
Composite(복합체) 역
- 그릇을 나타내며 Leaf 역이나 Composite 역을 넣을 수 있다.
- Directory 클래스가 이 역할
Component 역
- Leaf 역과 Composite 역을 동일시하기 위한 역할
- Entry 클래스가 이 역할
Client(의뢰자) 역
- Composite 패턴의 사용자
- Main 클래스가 이 역할
정리
- Composite 패턴은 그릇과 그 내용물을 동일시하는 패턴이다. 그릇 안에 무엇이 들어있던 간에 하나의 컴포넌트로 취급하여 클라이언트에서 사용한다.
- 일반적으로 재귀구조에서 많이 사용한다. (윈도 시스템)
반응형