1. Composite pattern이란?
단일 객체나 복수 객체의 타입을 동일하게 취급하는 패턴입니다.
즉, 단일 객체와 복합 객체의 처리방법이 차이가 없을 경우 사용합니다.
2. Composite pattern 예제
Composite pattern이 적용된 파일 시스템을 간단하게 구현해보겠습니다.
1) Node.java
public interface Node {
public String getName();
default public List<Node> getNodes() {
return null;
}
}
Node는 표현할 요소들의 추상적인 인터페이스 역할을 합니다.
2) File.java
public class File implements Node {
private String name;
public File(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
}
File은 Node 인터페이스를 구현한 요소입니다.
3) Directory.java
public class Directory implements Node {
private String name;
private List<Node> nodes = new ArrayList<>();
public Directory(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public List<Node> getNodes() {
return nodes;
}
}
Node List를 저장할 수 있습니다. Directory 또한 Node 인터페이스를 구현했기 때문에 Directory를 nodes에 저장할 수 있습니다. Directory안에 Directory가 저장되는 구조를 생각하면 이해하기 쉽습니다.
4) Main.java
public class Main {
public static void main(String[] args) {
Directory videoDir = new Directory("video");
Directory dramaDir = new Directory("drama");
File drama01 = new File("drama01.mp4");
File drama02 = new File("drama02.mp4");
File memo = new File("readme.txt");
dramaDir.getNodes().add(drama01);
dramaDir.getNodes().add(drama02);
videoDir.getNodes().add(dramaDir);
videoDir.getNodes().add(memo);
showAll(videoDir);
}
static public void showAll(Node node) {
System.out.println(node.getName());
if (Objects.nonNull(node.getNodes())) {
System.out.println("----");
node.getNodes().forEach(n -> showAll(n));
System.out.println("----");
}
}
}
3. 출력
video
----
drama
----
drama01.mp4
drama02.mp4
----
readme.txt
----
참조 :
jdm.kr/blog/228
'IT > 디자인 패턴' 카테고리의 다른 글
[Design Pattern] 추상 팩토리 패턴(Abstract factory pattern) (0) | 2020.10.27 |
---|---|
[디자인 패턴] 팩토리 메소드 패턴 (0) | 2020.10.19 |
[디자인 패턴] 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.10.16 |
[디자인 패턴] 프록시 패턴 (Proxy Pattern) (0) | 2020.10.15 |
MVVM 패턴이란? (0) | 2020.05.09 |