컴포지트

컴포지트 패턴

컴포지트 패턴은 클라이언트가 복합 객체나 단일객체를 동일하게 취급할 수 있도록 한다. 컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 이 패턴을 통해 composite(복합)객체를 만들어낼 수 있다.

언제 사용하는가

복합 객체와 단일 객체의 처리 방법이 동일한 경우, 전체-부분 관계로 정의가 되고, 이를 효율적으로 정의할 수 있다.
출처

Client클래스는 공통 인터페이스 Component만 관여한다. Leaf는 Component 인터페이스를 구현하는 객체이며, Composite는 Component의 객체자식을 유지하면서 요청을 전달하는 역할을 한다.

코드로 보는 컴포지트 패턴

Component 공통 인터페이스

package compositepattern;

public interface Graphic {
    public void print();
}

leaf에 해당하는 구현객체

package compositepattern;

public class Ellipse implements Graphic{
    @Override
    public void print() {
        System.out.println("Ellipse");
    }
}

Composite 인터페이스의 내용물을 구현한것을 알 수 있다.

자식들을 관리하는 Composite

package compositepattern;

import java.util.ArrayList;
import java.util.List;

public class CompositeGraphic implements Graphic{
    private List<Graphic> childGraphics = new ArrayList<Graphic>();

    @Override
    public void print() {
        for (Graphic graphic : childGraphics) {
            graphic.print();
        }
    }
    public void add(Graphic graphic) {
        childGraphics.add(graphic);
    }
    public void remove(Graphic graphic) {
        childGraphics.remove(graphic);
    }
}

인터페이스 구현체들을 저장할 수 있는 리스트를 만들고, 저장과 삭제 기능을 구현해 두었다.
동시에 Component의 기능인 print를 오버라이딩 하였다.

드라이버 코드와 서로의 관계

package compositepattern;

public class Driver {
    public static void main(String[] args) {
        Ellipse ellipse1 = new Ellipse();
        Ellipse ellipse2 = new Ellipse();
        Ellipse ellipse3 = new Ellipse();
        Ellipse ellipse4 = new Ellipse();

        CompositeGraphic graphic = new CompositeGraphic();
        CompositeGraphic graphic1 = new CompositeGraphic();
        CompositeGraphic graphic2 = new CompositeGraphic();

        graphic1.add(ellipse1);
        graphic1.add(ellipse2);
        graphic1.add(ellipse3);

        graphic2.add(ellipse4);

        graphic.add(graphic1);
        graphic.add(graphic2);

        graphic.print();
    }
}

리프 객체를 4개 만들고, 콤포지트 객체인 그래픽1, 2에 각각 3개 1개를 넣어주었다,

그리고 컴포지트 객체에 이를 다시 넣어 print 하면
안에 들어간 4개의 객체가 출력되는것을 볼 수 있다.

이러한 구조를 가지고 있는것을 볼 수 있다.

Component의 두가지 방식

타입의 안정성

지금까지 보여준 예시는 타입의 안정성을 추구하는 방식이다.
Component에는 자식을 다루는 메소드가 없고, 오로지 Composite에만 있는것이다. 이렇게되면 Leaf가 자식을 다루는 객체를 호출 할 수 없고, Client 역시 이를 사용할 수 없다.

일관성

일관성을 추구하는 방식은, Component가 자식을 관리하는 메소드들을 전부 가지고있다. 따라서 Leaf가 자식관리 메소드를 호출 할 수 있고 이는 클라이언트도 이에 접근할 수 있게 된다.

이론상의 컴포지트 패턴은 안정성보다는 일관성을 더 강조한다고 한다.

출처

좋은 웹페이지 즐겨찾기