컴포짓 패턴이란 무엇이고 언제 사용하는가?
컴포짓 패턴은 단일 객체와 두 개 이상의 객체들의 집합을 같은 방법으로 처리하기 위해서 만들어진 패턴이다.
- 단일 객체와 객체들의 집합 간의 처리 방법의 차이가 없을 경우에 사용한다.
- 트리구조를 구성할때 주로 사용된다.
실습
Component
모든 component 들을 위한 추상화된 개념으로써, "Leaf" 와 "Composite" 클래스의 인터페이스이다.
Leaf
"Component" 인터페이스를 구현하고, 구체 클래스를 나타낸다.
Composite
"Component" 인터페이스를 구현하고, 구현되는 자식(Leaf or Composite) 들을 가지고, 이러한 자식들을 관리하기 위한 메서드(addChild, removeChild...)를 구현한다.
또한, 일반적으로 인터페이스에 작성된 메소드는 자식에게 위임하는 처리를 한다.
* Composite.operation() => Leaf.operation(), 자세한 이해는 아래 예제를 통해 할 수 있다.
간단한 파일 시스템 구현
추상화를 담당하는 Component 를 생성하고 File, Folder 클래스가 이를 상속받아 구현한다.
이때 Folder는 Composite에 해당되고 File은 Leaf에 해당된다. 이때 Folder는 리스트의 타입으로 Component 타입을 가진다.
따라서 Folder, File은 동일한 추상 클래스(인터페이스)를 구현하고 있으므로 계층형 구조를 만들 수 있다.
- Composite은 구현되는 자식들을 관리하는 역할을 갖는다.
List <Component> children = new ArrayList <>();
public boolean addComponent(Component component)
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment : Component
* Time : 9:05 오후
*/
abstract public class Component {
private String name;
public Component(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment : Leaf
* Time : 9:06 오후
*/
public class File extends Component{
public File(String name) {
super(name);
}
}
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment : Composite
* Time : 9:07 오후
*/
public class Folder extends Component{
List<Component> children = new ArrayList<>();
public Folder(String name) {
super(name);
}
public boolean addComponent(Component component) {
return children.add(component);
}
public boolean removeComponent(Component component) {
return children.remove(component);
}
public List<Component> getChildren() {
return children;
}
}
/**
* Project : EffectiveStudy
*
* @author : jwdeveloper
* @comment :
* Time : 9:05 오후
*/
public class Main {
public static void main(String[] args) {
Folder root = new Folder("root");
Folder home = new Folder("home");
Folder junwoo = new Folder("junwoo");
Folder music = new Folder("music");
Folder picture = new Folder("picture");
Folder doc = new Folder("doc");
Folder usr = new Folder("usr");
File track1 = new File("track1");
File track2 = new File("track2");
File pic1 = new File("pic1");
File doc1 = new File("doc1");
File java = new File("java");
root.addComponent(home);
home.addComponent(junwoo);
junwoo.addComponent(music);
music.addComponent(track1);
music.addComponent(track2);
junwoo.addComponent(picture);
picture.addComponent(pic1);
junwoo.addComponent(doc);
doc.addComponent(doc1);
root.addComponent(usr);
usr.addComponent(java);
show(root);
}
private static void show(Component component) {
System.out.println(component.getClass().getName() + "|" +component.getName());
if (component instanceof Folder) {
for (Component c : ((Folder) component).getChildren()) {
show(c);
}
}
}
}
Code Link
References
https://mygumi.tistory.com/343
https://stackify.com/oop-concepts-composition/
'CS > DesignPattern' 카테고리의 다른 글
(DesignPattern) 방문자 패턴 (0) | 2020.05.30 |
---|---|
(DesignPattern) 데코레이터 패턴 (0) | 2020.05.30 |
(DesignPattern) 브릿지 패턴 (0) | 2020.05.17 |
(DesignPattern) 추상팩토리 메서드 패턴 (0) | 2020.05.16 |
(DesignPattern) 빌더 패턴 (0) | 2020.05.10 |