C++ でのデコレータ パターンの動作について質問があります。次のシナリオを考えてみましょう(ネットから入手しました。申し訳ありませんが、すべての詳細を提供する必要があったため、質問を小さくすることはできませんでした。)
class print{
public:
virtual ~print(){};
virtual void print_name() = 0;
};
//Actual base class which is to be used for printing. Has only name
class name:public print{
public:
//Destructor
~name() { cout << "destructing name" << endl; }
void print_name(){
cout << "Ajay " << endl;
}
};
class decorator:public print{
print *print_content;
public:
//constructor
decorator(print* print_arg){
print_content = print_arg;
}
//Destructor
~decorator() {
if(print_content){
delete print_content;
print_content = NULL;
}
}
void print_name(){
print_content->print_name();
}
};
class surname:public decorator{
public:
//Constructor
surname( print * print_arg ):decorator(print_arg) {}
//Destructor
~surname(){
cout << "Destructing surname" << endl;
}
void print_name(){
cout << " Bidari" << endl;
decorator::print_name();
}
};
class address:public decorator{
public:
address( print * print_arg):decorator(print_arg) {}
~address(){
cout <<"Destructing address" << endl;
}
void print_name(){
cout << "Bijapur" << endl;
decorator::print_name();
}
};
すべてのクラスには、装飾的なデザイン パターンで必要なセマンティクスが必要です。主な機能は以下の通りです。
int main(){
print * name_surname_address = new address(new surname(new name));
name_surname_address->print_name();
}
プログラムは期待どおりに結果を出力します。
出力
Bidari
Ajay
Bijapur
Bidari
Ajay
呼び出しが surname::print_name() に到達する方法がわかりません。つまり、関数呼び出し
print * name_surname_address = new address(new surname(new name));
address の print_name を呼び出し、decorator::print_name() を呼び出し、次に print::print_name() を呼び出します。