반응형
Structural Pattern인 Composite Pattern에 대해 정리합니다.
Definition
'그릇'과 '내용물'을 동일시해서 '그릇'이 '내용물' 또는 '그릇'을 포함할 수 있는 재귀적인 구조를 만들기 위한 패턴
Composite Pattern은 Structural Pattern에 해당합니다.
Class Diagram
Leaf는 '내용물'의 역할을 합니다.
Composite는 '그릇' 및 '내용물'의 역할을 합니다.
Leaf와 Composite는 Component를 상속받아, Composite class가 Composite 및 Leaf class를 재귀적으로 담을 수 있습니다.
Sample Case
다음은 Composite 패턴을 적용한 시나리오입니다.
최대한 필요한 내용만 class와 method에 포함하였습니다.
Scenario
우리는 Client에게 File System을 제공합니다.
File System은 Directory와 File로 이루어지고, Directory와 File은 Entity라는 공통 형태로 관리될 수 있습니다.
Directory에는 Entity 형태(File 또는 Directory)의 객체면 모두 포함할 수 있는 add()라는 기능을 제공합니다.
File에는 홀로 존재하고 다른 Entity를 포함할 수 없습니다.
Class Diagram
Entity class는 File과 Directory의 abstraction class 이기 때문에 Directory는 File 및 Directory를 같은 형태로 쉽게 포함할 수 있습니다.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Main {
public static void main(String[] args) {
Directory rootDir = new Directory("root");
Directory usrDir = new Directory("usr");
Directory binDir = new Directory("bin");
rootDir.add(usrDir);
rootDir.add(binDir);
usrDir.add(new File("test1.txt"));
usrDir.add(new File("test2.txt"));
rootDir.printList();
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
|
public abstract class Entity {
public abstract String getName();
protected abstract void printList();
public void add(Entity entity) {}
public String toString() {
return getName();
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class File extends Entity{
private String name;
public File(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
protected void printList() {
System.out.println("/" + this);
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import java.util.ArrayList;
import java.util.Iterator;
public class Directory extends Entity{
private String name;
private ArrayList entities = new ArrayList();
public Directory(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
protected void printList() {
System.out.println("/" + this);
Iterator it = entities.iterator();
while(it.hasNext()) {
Entity entity = (Entity)it.next();
entity.printList();
}
}
public void add(Entity entity) {
entities.add(entity);
}
}
|
cs |
실행 결과입니다.
반응형
'프로그래밍 > 디자인패턴' 카테고리의 다른 글
디자인 패턴 - Facade (Structural Pattern) (0) | 2021.02.18 |
---|---|
디자인 패턴 - Decorator (Structural Pattern) (0) | 2021.02.17 |
디자인 패턴 - Bridge (Structural Pattern) (8) | 2021.02.16 |
디자인 패턴 - Adapter (Structural Pattern) (0) | 2021.02.15 |
디자인패턴 어렵지 않아요 (0) | 2021.02.12 |