|
Decorator Pattern (장식자 패턴) |
작성자 : 김 슬 기 |
작성일 : 2012. 1. 4 |
|
제목 : Decorator Pattern (장식자 패턴) |
1. 장식자 패턴 정의
- 주어진 상황 및 용도에 따라 어떤 개체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때
서브클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있습니다
2. 구현 관련사항
- 데코레이터 패턴에서 상속 구조상에 놓인 클래스들은 모두 최상위 클래스의 인터페이스를 지원해야함
- 중간 클래스로 Decorator 클래스를 정의해서 사용하는 것은 하위클래스 추가를 좀더 손쉽게 만들어주는 바람직한 방법
- Decorator 클래스는 추상 클래스로 정의
3. 장점과 단점
- 개체에 기능을 추가하고자 할 때 정적인 상속 관계를 이용하는 것보다 훨씬 유연하다
- 동일한 기능을 반복 하는 것이 간편해진다
- 클래스 수는 줄어드는 반면, 개체의 수는 많아 질 수 있다.
- 연결 형태에 따라 서로 다른 개체임에도 불구하고 비슷비슷하게 보일 수 있으므로, 디버깅하기
쉽지 않을 수 있다
4. 다른 패턴들과의 관계
- Decorator는 맨 마지막 개체가 중심이 되어 새로운 개체가 덧입혀지는 방식이고 Strategy 패턴
은 맨 처음 개체가 중심이 되어 개체의 내부 구현을 다른 개체에게 위임시켜나가는 방식이다
5. 예제코드
- 클래스다이어그램 |
- Airplane 클래스 class Airplane { public: Airplane(void); virtual ~Airplane(void); virtual void Attack()=0; }; |
- Decorator 클래스 class Decorator : public Airplane { public:
Decorator(Airplane* air) : airComponent(air) {} virtual ~Decorator(void);
void Attack() { if(airComponent != NULL) airComponent->Attack(); } private: Airplane* airComponent; }; |
- FrontAttackAirplane 클래스 class FrontAttackAirplane : public Airplane { public: FrontAttackAirplane(void); ~FrontAttackAirplane(void); void Attack() { cout<<"전방공격"<<endl; } }; |
- SideAttackAirplane 클래스 class SideAttackAirplane : public Decorator { public: SideAttackAirplane(Airplane* air):Decorator(air){} ~SideAttackAirplane(void);
void Attack() { Decorator::Attack(); cout<<"측면공격"<<endl; } }; |
- RearAttackAirplane 클래스 class RearAttackAirplane : public Decorator { public: RearAttackAirplane(Airplane* air):Decorator(air) {} ~RearAttackAirplane(void);
void Attack() { Decorator::Attack(); cout<<"후방공격"<<endl; } }; |
- Main void main() { Airplane* pFrontAttackAirplane = new FrontAttackAirplane(); Airplane* pSideAttackAirplane = new SideAttackAirplane(pFrontAttackAirplane); Airplane* pRearAttackAirplane = new RearAttackAirplane(pFrontAttackAirplane);
pRearAttackAirplane->Attack();
delete pRearAttackAirplane; delete pSideAttackAirplane; delete pFrontAttackAirplane;
} |
- 결과화면 |
|