컴포지트 패턴

MinSeong Kang·2022년 4월 14일
0

IT 지식

목록 보기
6/11
post-thumbnail

컴포지트 패턴이란?

단일 객체와 여러 개의 단일 객체들로 구성된 복합 객체를 클라이언트 입장에서 구별없이 다루게 해주는 패턴

  • Component : 모든 표현할 요소들 위한 추상화된 개념으로, Leaf 클래스와 Composite 클래스의 인터페이스이다.
public interface Component {
    void operation();
}
  • Leaf : Component 인터페이스를 구현한 단일 객체를 나타낸다.
public class Leaf implements Component {
    @Override
    public void operation() {}
}
  • Composite : Component 인터페이스를 구현하고, Child 객체(Leaf, Composite)를 가지며 이를 관리하는 메서드를 구현한다.
    • 클라이언트는 Composite 객체에 있는 Component를 이용할 때, Component 인터페이스를 사용한다.
    • Composite 객체의 operation()을 호출하면, Composite 객체가 가지고 있는 모든 Component 객체들의 operation()을 호출해주어야 한다. 이를 propagation 라고 한다.
import java.util.ArrayList;
import java.util.List;

public class Composite implements Component {

    private List<Component> componentList;

    public Composite() {
        componentList = new ArrayList<Component>();
    }

    @Override
    public void operation() {
        for (Component component : componentList) {
            component.operation();
        }
    }

    public void add(Component component) {
        componentList.add(component);
    }

    public void remove(Component component) {
        componentList.remove(component);
    }
}

실제 컴포지트 패턴의 형태는 두가지로 나눌 수 있다.


Leaf 클래스와 Composite 클래스가 공유하고 있는 추상체에 따라 두가지 형태가 가능하다.

1) Component를 인터페이스로 구현

인터페이스로 구현하여 자식을 관리하는 메서드를 Composite 클래스에 선언하는 방법이다. 따라서 클라이언트는 Leaf 클래스와 Composite 클래스를 다르게 취급한다. 하지만 클라이언트가 Leaf 객체가 자식을 관리하는 메서드를 호출하지 못하도록 설계하였기 때문에 안정성을 얻게 된다.

2) Component를 추상 클래스로 구현

추상클래스로 구현하여 자식을 관리하는 메서드를 Component 클래스 내에 선언하는 방법이다. 이로 인해 클라이언트는 Leaf 클래스와 Composite 클래스를 일관되게 취급할 수 있다. 하지만 클라이언트는 Leaf 객체가 자식을 관리하는 메서드를 호출할 수 있기 때문에 안정성을 잃게 된다.

Component leaf = new Leaf();
Component composite = new Composite();

다음과 같이 컴포지트 패턴의 정의와 같이 클라이언트가 단일 객체와 복합 객체를 구별없이 다루기 위해서는 추상 클래스를 통한 구현이 적절하다고 생각한다. (저의 생각..입니다..)

참고 자료

https://mygumi.tistory.com/343
https://gmlwjd9405.github.io/2018/08/10/composite-pattern.html

0개의 댓글