Updated:

1. 개요

객체들을 트리 구조로 구성하여 사용자가 개별 객체와 복합 객체를 동일하게 다룰 수 있도록 하는 패턴

복합체 패턴(Composite Pattern)은 구조 패턴(Structural Pattern)의 한 종류로, 객체들을 트리 구조로 구성하여, 개별 객체와 개별 객체들을 모아서 만들어진 복합 객체를 다룰 때, 모두 동일한 방식으로 다룰 수 있게 하는 패턴이다.

2. 구조 패턴(Structural Pattern)

2-1. 구조 패턴이란?

구조 패턴이란 작은 클래스들의 상속과 합성을 통해 더 큰 클래스를 생성하는 방법을 제공하는 패턴으로, 독립적으로 개발한 클래스들을 마치 하나인 것 처럼 사용할 수 있다.

2-2. 구조 패턴 종류

3. 구성

[출처 : GoF의 디자인 패턴]

  • Component : 전체 클래스의 공통 행위를 정의해놓은 인터페이스

  • Leaf : 다른 객체를 포함하지 않는 가장 작은 단위의 Component 인터페이스 구현 클래스

  • Composite : Leaf와 Composite로 구성된 Component 인터페이스 구현 클래스

  • Client : Composite 인터페이스를 통해 객체 조작

4. 예제 코드

컴퓨터에 HDD를 추가한다고 가정해보자. 컴퓨터에 HDD를 직접 추가할 수도 있고, HDD가 들어있는 컴퓨터 여러대를 하나로 합쳐서 사용할 수도 있다.

4-1. Component

[Computer.java]

1
2
3
4
public interface Computer {

    int totalStorage();
}

4-2. Leaf

[Hdd.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Hdd implements Computer {

    private int storage;

    public Hdd(int storage) {
        this.storage = storage;
    }

    @Override
    public int totalStorage() {
        return storage;
    }
}

4-3. Composite

[CompositeComputer.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class CompositeComputer implements Computer {

    private List<Computer> computers = new ArrayList<>();

    @Override
    public int totalStorage() {
        int total = 0;
        for(Computer computer : computers) {
            total += computer.totalStorage();
        }
        return total;
    }

    public void add(Computer computer) {
        computers.add(computer);
    }
}

5. 테스트

[Clinet.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Client {

    public static void main(String[] args) {
        Hdd hdd1 = new Hdd(128);
        Hdd hdd2 = new Hdd(256);
        Hdd hdd3 = new Hdd(512);

        CompositeComputer compositeComputer1 = new CompositeComputer();
        compositeComputer1.add(hdd1);
        compositeComputer1.add(hdd2);
        System.out.println("compositeComputer1 storage : " + compositeComputer1.totalStorage() + " GB");

        CompositeComputer compositeComputer2 = new CompositeComputer();
        compositeComputer2.add(hdd3);
        System.out.println("compositeComputer2 storage : " + compositeComputer2.totalStorage() + " GB");

        CompositeComputer compositeComputer3 = new CompositeComputer();
        compositeComputer3.add(compositeComputer1);
        compositeComputer3.add(compositeComputer2);
        System.out.println("compositeComputer3 Storage : " + compositeComputer3.totalStorage() + " GB");
    }
}

[실행 결과]

6. 특징

  • 일관되고 단순한 구현 : 개별 객체와 복합 객체를 동일한 방식으로 구현 가능

  • 개방-폐쇄 원칙 준수 : 기존 코드의 변경 없이 기능 확장 가능

  • 공통 인터페이스 제공의 어려움 : 기능이 다른 클래스에 대한 공통 인터페이스 제공이 필요

7. Composite vs Decorator vs Proxy

  • Composite Pattern

    • 관련된 객체들을 하나의 인터페이스로 관리
  • Decorator Pattern

    • 상속 없이 동적으로 새로운 기능 추가
  • Proxy Pattern

    • 기능을 제공하는 대상에 대한 참조를 직접 관리하지 않음

Updated:

Leave a comment