객체들의 관계를 트리구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 해줌
Component : 단일 객체(Leaf)와 복합 객체(Composite)를 추상화한 공통 인터페이스, operation()은 Leaf와 Composite가 공통적으로 가져야 할 기능
Leaf : 단일 객체를 표현하는 클래스, 트리의 단말 노드
Composite : 복합 객체를 표현하는 클래스, 추가적인 기능들을 통해 Component 객체를 관리 (Leaf를 담는 그릇 역할)
컴포지트 패턴 적용 전
추가 생성 시, 별도의 메서드로 구현
클라이언트는 매번 객체에 적합한 메서드를 찾아 사용해야 함
package StructuralPatterns.Composite.ori;
public class File {
String name;
public File(String name) {
this.name = name;
}
}
public class Directory {
String name;
List<File> files;
List<Directory> directories;
public Directory(String name) {
this.name = name;
files = new ArrayList<>();
directories = new ArrayList<>();
}
public void addFile(File file){
files.add(file);
}
public void addDirectory(Directory directory){
directories.add(directory);
}
}
package StructuralPatterns.Composite.ori;
public class Main {
public static void main(String[] args) {
Directory root = new Directory("root");
Directory users = new Directory("users");
File imgA = new File("A.img");
File imgB = new File("B.img");
root.addDirectory(users);
users.addFile(imgA);
users.addFile(imgB);
}
}
컴포지트 패턴 적용 후
Component - 단일 객체(Leaf)와 복합 객체(Composite)를 추상화한 공통 인터페이스
package StructuralPatterns.Composite.apply;
public class Component {
String name;
public Component(String name) {
this.name = name;
}
}
Leaf / File - 단일 객체를 표현하는 클래스, 트리의 단말 노드
Composite /Directory - 복합 객체를 표현하는 클래스
package StructuralPatterns.Composite.apply;
public class File extends Component{
public File(String name) {
super(name);
}
}
public class Directory extends Component{
List<Component> components;
public Directory(String name) {
super(name);
components = new ArrayList<>();
}
public void addComponent(Component component){
components.add(component);
}
}
Main
Component 추상화를 통해 한 가지 메서드로도 원하는 대로 동작
단일, 복합 객체를 각각 별도로 구현하지 않아도 된다.
객체가 모두 같은 타입으로 취급되기에 새로운 클래스를 추가하는데 용이하다.
하지만 각 객체들을 구분하기 어려운 단점이 존재한다
package StructuralPatterns.Composite.apply;
public class Main {
public static void main(String[] args) {
Directory root = new Directory("root");
Directory users = new Directory("users");
File imgA = new File("A.img");
File imgB = new File("B.img");
root.addComponent(users);
users.addComponent(imgA);
users.addComponent(imgB);
}
}