728x90
반응형
Composite pattern
컴포짓 패턴 이란?
- composite 패턴은 Composite(디렉토리)과 Leaf(파일)을 동일시해서
재귀적인 구조를 만들기 위한 설계 패턴이다.
어떻게 Composite(디렉토리)과 Leaf(파일)를 동일하게 여길까?
- component 객체를 상속받아 Composite 와 Leaf 를 상속받도록 한다.
- 그렇게 되면 다형성으로 Composite, Leaf 를 동일한 객체로 바라볼수 있다.
컴포짓 패턴 구조
- Component : 최상의 객체
- 다형성을 위해 최상의 객체를 하나 둔다. - Composite: 복합객체
- 폴더를 담당한다.
- 그렇기 때문에 List 가 존재하고 add, remove, getChild 메서드가 존재한다. - Leaf: 단일 객체
- 파일 객체를 담당한다.
컴포짓 패턴 구조 설명
- 폴더 안에 폴더를 가지기 위해 다음과 같이 선언한다.
- Composite 에 List<Component> 로 멤버변수를 선언한다. - 그렇게 되면 Leaf 도 담을수 있고 compsite 도 담을수 있게 된다.
컴포짓 패턴 구조 실습 예제
- 위구조와 동일하다
Component Class
package patterns.composite;
public abstract class Component {
protected String name; // 폴더 또는 파일 이름을 저장한다.
public Component(String name) {
this.name = name;
}
public abstract String getName(); // 이름을 가져온다.
public abstract int getSize(); // 폴더 및 파일의 사이즈를 구한다.
}
Directory Class
package patterns.composite;
import java.util.ArrayList;
import java.util.List;
public class Directory extends Component {
List<Component> children = new ArrayList<>(); // 리스트를 가진다 상위 객체로 선언했기 때문에
// Component 로 상속받은 모든 객체를 담을수 있다.
public Directory(String name) {
super(name);
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
int size = 0;
for(Component component : children) {
size += component.getSize();
}
return size;
}
public void add(Component component) {
children.add(component);
}
public void remove(Component component) {
children.remove(component);
}
public List<Component> getChildren() {
return children;
}
}
File Class
package patterns.composite;
public class File extends Component { // Component 를 상속받아 구현한다.
private int size = 0;
public File(String name, int size) {
super(name);
this.size = size;
}
@Override
public String getName() {
return name;
}
@Override
public int getSize() {
return size;
}
}
Main class
package patterns.composite;
public class Main {
public static void main(String[] args) {
Directory root = new Directory("root");
Directory music = new Directory("music");
Directory downLoad = new Directory("Download");
File song1 = new File("song1", 10);
File song2 = new File("song2", 10);
File zip1 = new File("zip1", 15);
File zip2 = new File("zip2", 23);
music.add(song1);
music.add(song2);
root.add(music);
downLoad.add(zip1);
downLoad.add(zip2);
root.add(downLoad);
System.out.println("RootFolderSize: " + root.getSize());
System.out.println("DownLoadSize: " + downLoad.getSize());
System.out.println("MusicFolderSize: " + music.getSize());
PrintUtils.printList(downLoad);
}
}
전체 소스코드:
https://github.com/rnrl1215/design-pattern/tree/main/src/main/java/patterns/composite
참고:
https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4
728x90
반응형
'Design pattern > GoF(인강편)' 카테고리의 다른 글
[Design Pattern] Bridge Pattern (0) | 2021.12.26 |
---|---|
[Design Pattern] Abstract Factory Pattern (0) | 2021.11.29 |
[Design Pattern] Builder Pattern (0) | 2021.11.24 |
[Design Pattern] Prototype Pattern (0) | 2021.11.24 |
[Design Pattern] Singleton Pattern (0) | 2021.11.24 |
댓글