컨테이너와 내용물을 같게 다루기
Intent
Composite
is a structural design pattern that lets you compose objects into tree structures and then work with these structures as if they were individual objects.
Implementation

Applicablity
- Tree-like 구조가 필요할때
Come Examples
package oodesign.design.structural.composite; 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; } }
package oodesign.design.structural.composite; import java.util.ArrayList; import java.util.List; public class Directory extends Component{ List<Component> components = new ArrayList<>(); public Directory(String name) { super(name); } public boolean addComponent(Component component){ return components.add(component); } public boolean removeComponent(Component component){ return components.remove(component); } }
package oodesign.design.structural.composite; public class File extends Component { private Object data; public File(String name) { super(name); } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
package oodesign.design.structural.composite; public class Main { public static void main(String[] args) { Directory root = new Directory("root"); Directory home = new Directory("home"); Directory ndy = new Directory("ndy"); Directory music = new Directory("music"); Directory picture = new Directory("picture"); Directory doc = new Directory("doc"); Directory user = new Directory("user"); 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(ndy); ndy.addComponent(music); music.addComponent(track1); music.addComponent(track2); ndy.addComponent(picture); picture.addComponent(pic1); ndy.addComponent(doc); doc.addComponent(doc1); root.addComponent(user); user.addComponent(java); bfs(root); } private static void bfs(Component component){ System.out.println(component.getName()); if(component instanceof Directory){ ((Directory)component).components.forEach(Main::bfs); } } }
root home ndy music track1 track2 picture pic1 doc doc1 user java Process finished with exit code 0
핵심
- Composite과 Leaf 모두 Component의 구현체임
- Composite은 Leaf의 Collection을 가짐