Skip to content

Composite Pattern & CBD

Rinirihiriro edited this page Oct 30, 2014 · 1 revision

Composite Pattern

개요

객체들의 관계를 (Recursive한) 트리 구조로 구성하는 패턴. 단일 객체, 복합 객체 모두 같은 인터페이스를 제공한다.

용도

한 객체(Composite)가 여러 객체를 담아 관리하는 형태의 설계에서,
composite에 또 다른 composite를 담을 수 있게 하거나,
composite와 개별 객체를 명시적으로 구분하지 않고 같은 방식으로 사용할 수 있게 하거나,
전체 객체들을 다루는 것과 그 부분을 다루는 것을 똑같은 방식으로 처리할 수 있도록 하거나,
어떠한 작업을 하위 객체들에게 전파시키면서 recursive하게 동작시키거나,
여러 객체를 모음으로써 새로운 객체를 만들고 설계할 수 있다.

UML

계층 구조 이미지

예시 코드

class Component {
public:
  virtual ~Component() {}

  void Add(Component* com) {
    children.push_back(com);
  }

  void Remove(Component* com) {
    children.erase(std::find(children.begin(), children.end(), com));
  }

  virtual void DoSomething() {
    for (auto com : children) {
      com->DoSomething();
    }
  }

private:
  std::vector<Component*> children;

};

class Foo : public Component {
public:
  Foo(int num) :num(num) {}
  virtual ~Foo() {}
  virtual void DoSomething() override {
    std::cout << num << std::endl;
    Component::DoSomething();
  }

private:
  int num;

};

void main() {
  Foo a(1);
  Foo b(2);
  Foo c(3);
  Foo d(4);
  Foo e(5)

  a.Add(&b);
  a.Add(&c);
  d.Add(&a);
  d.Add(&e);

  d.DoSomething(); // 4 1 2 3 5
  a.DoSomething(); // 1 2 3
  c.DoSomething(); // 3
}

실제 예시

  • Cocos2D의 Node
    • addChild();
    • 자신이 그려질 때, Children들도 그린다.
  • 파일-폴더 계층구조
    • 폴더 하위에 폴더가 들어가는 것이 가능하다.
  • GUI
    • Form, Panel(컨테이너)나 Lable, Edit 등을 같은 방식으로 다룰 수 있다.

CBD (Component Based Development)

개요

소프트웨어 개발 방법론의 일종으로 프로그램의 로직을 각각의 독립적인 컴포넌트로 구성하고 이를 조립해 전체 프로그램을 구성하는 방법론.

배경

  • OOP 개발의 한계
    • 바이너리 레벨의 표준X
    • 재사용성이 소스코드(언어) 레벨로 제한됨.

특징

  • 컴포넌트
    • 컴포넌트를 개발하고, 완성된 컴포넌트들을 조립해서 소프트웨어 개발
    • 컴포넌트 개발 프로세스(CD)를 통해서 만들어진 컴포넌트들을 가지고 컴포넌트 조립 프로세스(CBD) 진행
    • 컴포넌트는 binary이기 때문에 개발 언어에 독립적
      • OOP보다 확장성이 높음
  • 반복 점진적 개발 프로세스
    • 컴포넌트 기반 설계 작업과 실제 컴포넌트 조립 및 테스트를 반복
    • iterate 단계별로 컴포넌트를 선택하고 조립

도표

실제 예시

  • COM (Component Object Model)
  • .NET