=== 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>
저렇게하는이유는 어떤 widget형 클래스건 decorate할수있다는점...? 이를 더 응용하면 decorator에서 멤버변수도 추가하고 함수도 추가하고 이것저것 decorate할수있다 이를 이용하지않는다면 widget형 클래스가 10개있다면... decorate하기위해 10개의 클래스를 더 만들어야함
제가이해하는게 맞는지모르겠어요
위젯에 대한 추상이 필드를 갖는다고 문제가 되진 않음
어차피 포인터로 넘어가는거라 복사라할게 없음
나머진 얼추 맞아요
데코레이터클래스에서 상속받는 widget클래스에 멤버변수가있으면 데코레이터에도 있게되는데 그값은 의미가없지않나요 데코레이터 생성자에서 그값을 widget->멤버변수로 초기화해주면 되겠지만은 패턴 설계 논리로생각하면 굳이복사할이유가 없을것같은 생각이에요 맞나요??
아맞다 답변 정말감사합니다ㅠ 제가생각한게 맞는지아닌지 몰랐었는데 덕분에 확신이생겼습니다 ㅎ
아 그러네요 바로 상속이 들어가면 필요없는 필드네
제대로 보신듯 근데 막상 필요할때는 원래 있던 클래스에다 기능좀 유연하게 넣는거라 완전 필드가 없는 클래스에 넣으려면 추상을 하나 만들고 이사를 가야겠네요 그런거 신경안쓰고 막 달아쓰고 그랬는데
감사합니다 !!