복합체(Composite) 패턴

1rock·2025년 4월 11일

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

  • 왼쪽 그림은 Animal이라는 interface가 있고 cat, dog이라는 클래스를 정의해서 Animal에서 상속받는 형태
  • 오른쪽 그림은 왼쪽 그림과 같이 object와 group도 interface에서 상속 시키는 방식으로 클래스 구조를 짤수 있다.

  • component: 컴포지트 패턴에서의 interface
  • leaf: component를 상속받은 객체를
  • composite: componet를 삭속받는 그룹
  • composite안에는 component, leaf, composite가 들어감
  • component를 상속받은 leaf와 composite는 component와 같은 함수를 갖고 있어야 한다.

파이썬 컴포지트 패턴 예시

컴포지트 패턴 예시 javascript로 구현

// 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();

/*
출력
동물들 울음소리
야옹
야옹
야옹
동물들 울음소리
멍멍
멍멍
*/

이와 같이 오브젝트들을 그룹으로 묶고 같은 인터페이스를 제공한다
핵심은 그룹과 오브젝트가 같은 인터페이스를 제공하며 루트에서 시작되는 함수 콜이 트리안에 있는 오브젝트로 함수가 퍼지는 구조이다.

참고 : 디자인패턴, Composite Pattern, 콤포짓 콤포지트 패턴

profile
FRONT_END_DEVELOMENT

0개의 댓글