=== C++ ===

<source lang=\"cpp\">
#include <iostream>

using namespace std;

/* Component (interface) */
class Widget {

public:
  virtual void draw() = 0;
  virtual ~Widget() {}
};
@@@@@@@@@@@@@@@@@@@@@@@@@
질문1. 이 widget클래스에는 멤버변수가 있으면 안되는게 맞나요 : 있다면 wiget* wg1 = new TextField(\"dd\")
\"dd\"라는 멤버변수가 저장됬다고하자
wiget* wg2 = new BorderDecorator(wg) 했을때
원소 \"dd\"는 복사되지도않고 새로운 클래스에는 멤버변수에는 쓰레기값과 wiget포인터변수에는 wg이 들어있을뿐이다
따라서 쓰레기값이라는 공간의낭비 쓸모없는 변수가 계속 할당됨...
제생각이 맞나용

결국 어떤 클래스의 포인터를 가지는 새로운 클래스가 만들어지고 그함수들은 widget의 함수들이고(틀이 widget과같음 상속을 받기때문)  그저 포인터연산을 하게된다(객체의 확장성>>>>>포인터연산 오버헤드무시?)
@@@@@@@@@@@@@@@@@@@@@@@@@@

/* ConcreteComponent */
class TextField : public Widget {

private:
   int width, height;

public:
   TextField( int w, int h ){
      width  = w;
      height = h;
   }

   void draw() {
      cout << \"TextField: \" << width << \", \" << height << \'\\n\';
   }
};

/* Decorator (interface) */
class Decorator : public Widget {

private:
   Widget* wid;       // reference to Widget

public:
   Decorator( Widget* w )  {
     wid = w;
   }

   void draw() {
     wid->draw();
   }

   ~Decorator() {
     delete wid;
   }
};
@@@@@@@@@@@@@@@@@@@@@
질문2
데코레이터 클래스에서는 그저 모든 함수에 대하여
wid->함수호출 하면된다
@@@@@@@@@@@@@@@@@@@@@
/* ConcreteDecoratorA */
class BorderDecorator : public Decorator {

public:
   BorderDecorator( Widget* w ) : Decorator( w ) { }
   void draw() {
      Decorator::draw();
      cout << \"   BorderDecorator\" << \'\\n\';
   }
};

/* ConcreteDecoratorB */
class ScrollDecorator : public Decorator {
public:
   ScrollDecorator( Widget* w ) : Decorator( w ) { }
   void draw() {
      Decorator::draw();
      cout << \"   ScrollDecorator\" << \'\\n\';
   }
};

int main( void ) {

   Widget* aWidget = new BorderDecorator(
                     new ScrollDecorator(
                     new TextField( 80, 24 )));
   aWidget->draw();
   delete aWidget;
}

</source>