繁体   English   中英

装饰模式如何在C ++内部工作?

[英]How does decorator pattern work internally in C++?

我有一个问题重新考虑在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();
}

程序按预期打印结果。

OUTPUT

 Bidari
Ajay

Bijapur
 Bidari
Ajay

我不明白调用如何登陆surname :: print_name()。 我的意思是函数调用

print * name_surname_address = new address(new surname(new name));

调用print_name的地址调用decorator :: print_name(),后者又调用print :: print_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'。

PS如果你发现这个解释没有用,我不会责怪你,因为我觉得它也很重要:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM