컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
** 한 오브젝트의 그룹과 그 오브젝트의 싱글인스턴스가 같은 타입으로 취급되는 패턴 또한 컴포지트 패턴을 통해서 오브젝트를 트리 구조로 구성 할 수 있다.



- component: 컴포지트 패턴에서의 interface
- leaf: component를 상속받은 객체를
- composite: componet를 삭속받는 그룹

// Component 인터페이스
interface Component {
fn(): void;
}
// Leaf 클래스 (단일 요소)
class Leaf implements Component {
fn(): void {
console.log("leaf");
}
}
// Composite 클래스 (복합 요소)
class Composite implements Component {
private components: Component[] = [];
add(component: Component): void {
this.components.push(component);
}
fn(): void {
console.log("composite");
for (const component of this.components) {
component.fn();
}
}
}
// 사용 예시
const composite1 = new Composite();
composite1.add(new Leaf());
composite1.add(new Leaf());
const composite0 = new Composite();
composite0.add(new Leaf());
composite0.add(composite1);
composite0.fn();
/*
출력
composite
leaf
composite
leaf
leaf
/*
// Component
interface Animal {
speak(): void;
}
// Leaf
class Cat implements Animal {
speak(): void {
console.log('야옹');
}
}
// Leaf
class Dog implements Animal {
speak(): void {
console.log('멍멍');
}
}
// Composite
class AnimalGroup implements Animal {
private animals: Animal[] = [];
add(animal: Animal): void {
this.animals.push(animal);
}
speak(): void {
console.log("동물들 울음소리");
for (const animal of this.animals) {
animal.speak();
}
}
}
// 사용 예시
const catGroup = new AnimalGroup();
catGroup.add(new Cat());
catGroup.add(new Cat());
catGroup.add(new Cat());
const dogGroup = new AnimalGroup();
dogGroup.add(new Dog());
dogGroup.add(new Dog());
const zoo = new AnimalGroup();
zoo.add(catGroup);
zoo.add(dogGroup);
zoo.speak();
/*
출력
동물들 울음소리
야옹
야옹
야옹
동물들 울음소리
멍멍
멍멍
*/
이와 같이 오브젝트들을 그룹으로 묶고 같은 인터페이스를 제공한다
핵심은 그룹과 오브젝트가 같은 인터페이스를 제공하며 루트에서 시작되는 함수 콜이 트리안에 있는 오브젝트로 함수가 퍼지는 구조이다.