컴포지트 패턴

이정석·2023년 5월 28일
0

디자인패턴

목록 보기
5/23
post-thumbnail

컴포지트 패턴이란?

단일객체와 복합객체를 같은 인터페이스로 다루고 싶을 때 사용하는 패턴으로 클라이언트는 단일, 복합 객체를 구분할 필요 없이 동일하게 취급할 수 있다.

컴포지트 패턴으로 클라이언트는 트리구조를 가진 복잡한 객체들을 보다 쉽게 다룰 수 있다.


구조

  1. Component: Leaf의 공통 인터페이스와, Leaf에 접근하고 관리하기 위한 인터페이스를 정의한다.
  2. Leaf: Leaf객체를 가지지 않는 객체로 조합에 이용되는 객체들의 기본적인 연산들을 정의한다.
  3. Composite: Leaf객체를 가지는 객체로, 위임 방식으로 Leaf의 공통 인터페이스를 구현한다.

코드(JAVA)

1.Component

interface Component {
    void operate();
    void addComponent();
    void removeComponent();
}

2. Leaf

class Leaf implements Component {
    public void operate() {
    	//Do Something
    }
    public void addComponent() {}
    public void removeComponent() {}
}

실제 기능을 구현하는 Leaf클래스는 행동에 대한 기능(operate)를 구현하지만 Composite객체에서 사용할 기능(addComponent,removeComponent)는 구현하지 않는다.

3. Composite

class Composite implements Component {
    List<Component> cmps = new ArrayList<>();

    public void operate() {
        for(Component c : cmps) {
            c.operate();
        }
    }

    public void addComponent(Component c) {
        cmps.add(c);
    }

    public void removeComponent(Component c) {
        cmps.remove(c);
    }
}

복합객체를 구현한다. 실제 기능에 해당하는 operate()는 하위에 있는 Component에 메시지를 전파하는 역할을 한다.

4. Client

public class Client {
    public static void main(String[] args) {
        Leaf c1 = new Leaf();
        Leaf c2 = new Leaf();
        Leaf c3 = new Leaf();

        Composite composite1 = new Composite();
        composite1.addComponent(c1);
        composite1.addComponent(c2);

        Composite composite2 = new Composite();
        composite2.addComponent(c3);
        composite2.addComponent(composite1);

        composite2.operate();
    }
}

Client는 최상위 복합객체인 composite2에 operate명령을 내림으로 하위에 있는 컴포넌트객체들(c1,c2,c3,composite1)에 대한 결과를 얻을 수 있다.


완성된 구조는 트리구조?

컴포지트 패턴은 트리구조를 가진 복잡한 객체들을 다루기 위해서 단일 객체와 복합 객체의 인터페이스를 일관되게 함으로 구현한다.

컴포지트 패턴으로 트리구조를 만드는 것과 헷갈리지 말자!

관리함수를 Composite에 선언?

위의 구조를 보면 Component클래스에 addComponent, removeComponent를 선언해놓았는데, 이는 클라이언트의 편의성을 위한 것이다.

  • 만약 Composite클래스에 선언했다면 클라이언트는 addComponent를 호출하기 위해 객체가 Leaf인지 Composite인지 따져봐야 한다.
profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글