본문 바로가기

기타/Design pattern

Decorator pattern


1. Issue

● 객체에 정해진 기능이 아닌 동적으로 기능을 추가할 수 있는가?

 

2. Why

● 프로그램의 확장에 따라서 새로운 기능이 추가되거나 삭제 될 때가 잇다.

● 클래스에 새로운 기능을 추가하면 클래스를 재정의 해야 한다.

● 새로운 기능 추가에 대해 클래스 상속을 이용하면 수많은 클래스가 생겨버린다.

 

 

3. Solution (Decorator 패턴)

○ 기존에 존재하는 기능 외에 새로운 기능 추가 시 연결고리(Decorator) 를 하나 만들어 준다.

○ 기존에 존재하는 기능이 아닌 기능이 새로 추가 된 것처럼 적용

 

 

 

 

○ 객체들 간의 관계

 

class Decorator : public Airplane {

public :

Decorator(Airplane * pObj) { pComponent_ = pObj;}

~Decorator() {}

virtual void Attack(){

if(pComponent_ != 0)

pComponent_ -> Attack();

}

private :

Airplane* pComponent_;

};

 

class SideAttackAirplane : public Decorator{

public :

SideAttackAirplane(Airplane* pObj) : Decorator(pObj) {}

 

void Attack(){

Decorator::Attack();

//측면 공격 수행

cout<<"측방공격"<<endl;

}

};

 

class RearAttackAirplane : public Decorator {

public:

RearAttackAirplane(Airplane* pObj) : Decorator(pObj) {}

void Attack(){

Decorator::Attack();

//후방 공격 수행

cout<<"후방공격"<<endl;

}

};

 

void main()

{

Airplane* pFrontAttackAirplane = new FrontAttackAirplane;

Airplane* pSideAttackAirplane = new SideAttackAirplane(pFrontAttackAirplane);

Airplane* pRearAttackAirplane = new RearAttackAirplane(pSideAttackAirplane);

 

pRearAttackAirplane->Attack();

 

}

 

4. Good point

● 동일한 기능을 반복하는 것이 간편하다.

● 클래스의 수가 줄어든다.

● 다른 클래스의 변경이 없어도 객체에 새로운 기능을 추가할 수가 있다.

● 삭제시 에도 간편.

● Decorator클래스를 이용해서 동일한 기능을 반복하는 것이 간편하다. 동일한 기능을 반복 수행하고 싶을 때 반복 수행하고 싶은 횟수만큼 객체를 생성해 하나의 연결고리로 연결해 원하는 기능 수행을 요청하면 연결 고리를 따라가면서 동일한 기능이 쉽게 반복 수행된다.

● 간단한 클래스만 정의하고 후에 조금씩 확장시켜 나가는 방식이므로 미리 예측 가능한 모든 특성들을 지원할 필요가 없다.

 

5. Bad point

● 객체의 수가 많아 진다.

● 큰 프로젝트에서 하나의 문제를 찾기 위해서 여러 객체의 함수를 조사하므로 디버깅이 어려울 수 있다.

 

6. A point to be considered (고려사항)

● 최상위클래스는 최대한 데이터 멤버를 적게 정의한다. Decorator 패턴을 활용해서 객체에 기능을 추가 , 삭제하려면 많은 객체가 생성 되는데 최상위클래스에 데이터멤버가 많이 정의 되어 있으면 불필요하게 메모리를 많이 사용할 수 있다.

● Decorator클래스를 두어야 하는 이유는 최상위 클래스는 Decorator역할의 하위 클래스와 일반 하위 클래스를 대표하기 때문에 새로 추가 되는 하위 클래스에서 공통되는 데이터 멤버들을 매번 정의해야 한다. 그러므로 중간 클래스로 Decorator클래스를 정의해서 사용하는 것이 하위 클래스 추가를 좀 더 쉽게 만들어준다.

 

7. Compare Adapter Pattern with Decorator Pattern

● Decorator 패턴: 객체, 기능을 변경하지 않고 새로운 기능을 추가 한다.

● Adatper 패턴: 다른 두개의 객체, 기능을 연결하기 위해 사용한다.

'기타 > Design pattern' 카테고리의 다른 글

Singleton pattern  (0) 2009.04.27
Builder pattern  (0) 2009.04.27
Adapter pattern  (0) 2009.04.27
Abstract Factory pattern  (0) 2009.04.27
소프트웨어 개발 기본 요소  (0) 2009.04.27