【问题标题】:How does decorator pattern work internally in C++?装饰器模式在 C++ 内部如何工作?
【发布时间】:2013-06-12 18:13:33
【问题描述】:

我有一个问题要重新评估 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();
   }
   }; 

所有类都具有装饰设计模式所需的语义。 ma​​in函数如下。

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 调用 decorator::print_name() 进而调用 print::print_name()。

【问题讨论】:

  • decorator::print_name() 不调用print::print_name()print::print_name() 是纯的,程序会崩溃。 decorator::print_name() 实际上调用了print_content-&gt;print_name() 恰好是surname::print_name()

标签: c++ design-patterns inheritance


【解决方案1】:

首先创建“名称”对象。它将打印“Ajay”。 然后在创建“姓氏”对象时将该对象作为参数传递。 姓氏对象将创建一个“装饰器”,它会记住“名字”的地址(Ajay) - 你继承了装饰器!!!
Surname 还覆盖了打印功能 - 它打印 'Bidari' 并调用 decorator::print_name();
现在,您在创建“地址”对象时将“姓氏”对象作为参数传递。 “地址”对象将创建一个“装饰器”(同样,您继承了装饰器),它将记住“姓氏”(Bidari)的地址。
'address' 也覆盖了 print 函数——它打印 'Bijapur' 并调用 decorator::print_name();

或者在你进行实际的函数调用时解释它,你在'address'对象上调用print。 它将打印“Bijapur”并在“姓氏”(decorator::print_name())上调用 print,因为您通过传递“姓氏”创建了“地址”。这将打印“Bidari”。之后立即调用 decorator::print_name() 并打印第一个 - 'Ajay'。

附: 如果你觉得这个解释没有用,我不会怪你,因为我也觉得读起来很沉重:-)

【讨论】:

  • 答案帮助我理解。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2015-03-12
  • 2012-02-04
  • 2014-10-29
  • 2015-05-20
  • 2020-11-03
  • 1970-01-01
  • 2016-01-06
  • 2011-05-22
相关资源
最近更新 更多