복합체( 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

가교( bridge )

Posted 2012. 10. 23. 13:47

추상과 구현을 분리한 패턴

즉, 인터페이스는 같고 내부 구현은 다르게 하고 싶은 경우.


장점.

1. 인터페이스와 구현을 불리해준다.

2. 실행 시간에 구현 객체를 결정 할 수 있다.

3. 인터페이스과 구현이 분리됨으로써 내부 구현ㅇ ㅣ변경되더라도 client는

컴파일 할 필요가 없다.

4. client는 인터페이스의 내부 구현을 알수 없다.


주로 Lib에 많이 사용 된다.


Abstraction - 추상 인터페이스를 정의한다. Implementor에 대한 레퍼런스를 유지한다.

RefinedAbstraction - Abstraction에 의해 정의된 인터페이스를 확장한다.(extends)

Implementor - 구현 클래스를 위한 인터페이스를 정의한다.

ConcreteImplementor - Implementor 인터페이스를 구현한다.



#include <iostream>

#include <iomanip>        // 출력 스트림 방식 결정 하는 헤더 파일

#include <string.h>

using namespace std;


class TimeImp

{

public:

TimeImp( int hr, int min )

{

hr_ = hr;

min_ = min;

}

virtual void tell()

{

cout << "time is " << setw(2) << hr_ << min_ << endl;

}

protected:

int hr_, min_;

};


// 민간인 시간

class civilianTimeImp : public TimeImp

{

public:

civilianTimeImp( int hr, int min, int pm ) : TimeImp( hr, min )

{

if( pm )

strcpy( whichm_, " PM");

else

strcpy( whichm_, " AM");

}


/*virtual*/

void tell()

{

cout << "time is " << hr_ << ":" << min_ << whichm_ << endl;

}

protected:

char whichm_[4];

};


//군대 시간

class ZuluTimeImp : public TimeImp

{

public:

ZuluTimeImp( int hr, int min, int zone ) : TimeImp( hr, min )

{

if( zone == 5 )

strcpy( zone_, " Eastern Standard Time");

else if( zone == 6 )

strcpy( zone_, " Central Standard Time");

}


/*virtual*/

void tell()

{

cout << "time is " << setw(2) << hr_ << min_ << zone_ << endl;

}


protected:

char zone_[30];

};


class Time

{

public:

Time(){}

Time( int hr, int min )

{

imp_ = new TimeImp( hr, min );

}

virtual void tell()

{

imp_->tell();

}

protected:


TimeImp *imp_;

};


class CivilianTime : public Time

{

public:

CivilianTime( int hr, int min, int pm )

{

imp_ = new civilianTimeImp(hr, min, pm);

}

};


class ZuluTime : public Time

{

public:

ZuluTime( int hr, int min, int zone )

{

imp_ = new ZuluTimeImp( hr, min ,zone );

}

};


void main()

{

Time *times[3];

times[0] = new Time(14, 30);

times[1] = new CivilianTime(2, 30, 1);

times[2] = new ZuluTime(14, 30, 6);

for( int i = 0 ; i < 3 ; i++ )

{

times[i]->tell();

}

}

출력

->time is 1430

->time is 2:30 PM

->time is 1430 Central Standard Time

요약

Posted 2012. 10. 22. 17:44

1, 추상팩토리

2. 빌더 

3. 팩토리 매서드

4. 원형

5. 싱글통


이 중에 팩토리 매서드만 빼고는 실제 객체를 생성해서 반환하는 디자인 패턴.

팩토리 매서드는 생성 매서드만 따로 서브클래스를 두어 오버로딩하여 생성 방법에 대한

유연성을 염두한 패턴임.

싱글톤은 다양한 생성방법을 위하기 보다 객체의 유일성을 보장하기 위한 패턴

추삭 팩토리와 빌드 패턴은 객체를 생성해서 생성감독객체에 매개변수를 넘기는 식으로

디자인 했고

원형 패턴은 원형을 반환받아 직접 설정하거나 설정을 해둔 함수를 통해 반환하는 방법.

« PREV : 1 : ··· : 36 : 37 : 38 : 39 : 40 : 41 : 42 : ··· : 77 : NEXT »