: 실행 시간에 객체에 기능을 추가할 때 사용하는 패턴
왜 안되냐면?
right 생상자로 진입하는 순간 fire 의 가상 함수포인터는 right 로 지정되개 때문임
- 상속은 클래스의 기능을 추가하는 것임. 또 다른 객체를 생성하게 됨.
발사체(파란 색) 가 하나 있는 우주선이 있음.

아이템을 획득해서 왼쪽에 미사일이 장착되었다고 하자.
가) 우주선은 그대로 진행 중에, 아이템을 획득 후에서 왼쪽 미사일을
발사할 수 있어야 함.


-> 결과 : 상속을 통해서는 접근할 수 없음 / 업캐스팅으로 해결 불가함.
1) 상속을 제거
2) 구성 포인터에 기본이 되는 것을 참조

: left 미사일까지도 유지가 되어야 하는데,
당연히 불가함.
그림 : 불가함!




결과 : 실행 시간에 객체에 기능을 추가함.
: Left, Right에 구성을 만들어서 처리를 했는데,
이를 공통의 클래스를 상속해 보완할 수 있음.

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
#include <map>
class Component
{
public :
virtual void fire() = 0;
virtual ~Component() {}
};
class spaceShip : public Component
{
public :
virtual void fire()
{
cout << "=====" << endl;
}
};
class IDecorator : public Component
{
Component * craft;
public :
IDecorator(Component *p) : craft(p) {}
void fire() { craft->fire(); }
};
class LeftMissile : public IDecorator
{
public :
LeftMissile(Component *obj) : IDecorator(obj){}
virtual void fire()
{
IDecorator::fire();
cout << ">>>>>" << endl;
}
};
class RightMissile : public IDecorator
{
//private:
//Component * s;
public:
RightMissile(Component *obj) : IDecorator(obj) {}
void fire()
{
IDecorator::fire();
cout << "<<<<<" << endl;
}
};
int main()
{
spaceShip s;
s.fire();
LeftMissile l(&s);
l.fire();
RightMissile r(&l);
r.fire();
}