Composite Pattern 이란?

  • 여러 객체를 가진 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용
  • 객체들의 관계를 트리구조로 구성하여 부분-전체 계층을 표현하는 패턴으로,
    사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 해줌

  • 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);
    }
}

+ Recent posts