[디자인 패턴][구조 패턴] 복합체 패턴(Composite Pattern)
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
- 기능을 제공하는 대상에 대한 참조를 직접 관리하지 않음
Leave a comment