我有一个问题重新考虑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));
调用print_name of address调用decorator :: print_name(),后者又调用print :: print_name()。
答案 0 :(得分:2)
首先创建'name'对象。它将打印“Ajay”。
然后在创建“surname”对象时将该对象作为参数传递。
姓氏对象将创建一个'装饰者',它将记住'name'(Ajay)的地址 - 你继承了装饰者!!!
姓氏也会覆盖打印功能 - 它会打印'Bidari'并调用decorator :: print_name();
现在,在创建“地址”对象时,将“surname”对象作为参数传递。
'address'对象将创建一个'decorator'(再次,你继承了装饰器),它将记住'surname'(Bidari)的地址。
'address'也覆盖了print函数 - 它打印'Bijapur'并调用decorator :: print_name();
或者在进行实际函数调用时解释它,在“地址”对象上调用print。 它将打印'Bijapur',它将在'surname'(decorator :: print_name())上调用print,因为你通过传递'surname'来创建'地址'。这将打印'Bidari'。之后立即调用decorator :: print_name()并打印第一个--'Ajay'。
P.S。 如果你发现这个解释没有用,我不会责怪你,因为我觉得它也很重要: - )