복합체( Composite )
Posted 2012. 10. 23. 14:48어느 객체가 다른 객체의 일부가 되는 관계는 Composite(구성) 관계라 한다.
여러개의 객체를 하나의 객체로 보이게 하고 싶을때 사용
기본 제품으로 새로운 제품을 만들어 사용 하고 싶을 경우
기본 객체 : 원래 존재하는 객체
구성 객체 : 기본 객체들로 이루어진 새로운 객체( 삼각형 + 사각형 = 집 )
구성 객체를 생성하고 그 안에 기본 객체들을 포함시켜 관리한다
하지만 이럴 경우 자료형이 서로 완전히 달라 따로 관리해야 하므로 불편하다.
구성 객체를 생성함에 있어 부모 클래스의 어떠한 인터페이스를 포함시키고 각 인터페이스의 구현은
어떻게 할 것인가가 중요하다.
Composite패턴의 중요함은 Composite 객체도 사용자가 느끼기에 같은 객체로 느껴야 하기 때문에,
Composite 객체에만 필요한 인터페이스라도 다른 기본 객체에도 제공 되어져야 한다.
따라서 최상위 클래스에서는 virtual 함수를 정의하고 구현하지 않는 식으로 기본 클래스에
인터페이스만 제공 할 수 있다.
장점.
기본 객체와 구성 객체를 구별하지 않고 소스코드를 작성 할 수 있어 좋다.
새로운 클래스의 추가가 용이하다.( 기존 소스코드의 변경이 필요 없다.)
복합체는 복합체를 포함 할 수 있어 트리구조로 컨테이너 객체를 표현 할 수 있다.
#include <iostream>
#include <vector>
using namespace std;
class Component
{
public:
virtual void traverse() = 0;
};
class Leaf : public component
{
private:
int value;
public:
Leaf( int val )
{
value = val;
}
void traverse()
{
cout << value << ' ';
}
};
class Composite : public Component
{
private:
vector < Component * > chileren;
public:
void add( Component *ele )
{
children.push_back(ele);
}
void traverse()
{
for( int i=0 ; i<children.size() ; i++ )
{
children[i]->traverse();
}
}
};
void main()
{
int i, j;
Composite containers[4];
for( i=0 ; i<4 ; i++ )
{
for( j=0 ; j<3 ; j++ )
{
containers[i].add( new Leaf(i * 3 + j) );
}
}
for( i=1 ; i<4 ; i++ )
containers[0].add( &( containers[i] ) );
for( i=0 ; i<4 ; i++ )
{
containers[i].traverse();
cout << endl;
}
}
-> 0 1 2 3 4 5 6 7 8 9 10 11
-> 3 4 5
-> 6 7 8
-> 9 10 11
- Filed under : 디자인 패턴/3. 복합체( Composite )