2

我想在 C++ 中使用装饰器模式,并且仍然能够依赖被装饰对象的签名/身份。是否有可能在 C++ 中做到这一点?

也就是说,我想装饰一个组件:

class Component {
  public:
      Component();
      virtual void doSomething();
}

带装饰器:

class Decorator : public Component {
  public:
      Decorator(Component*);
      virtual void doSomething();
  private:    
      Component* _component;
}

这样当我这样做时:

Component foo;
Decorator(&foo) bar;
std::cout << typeid(bar).name() << std::endl;

它打印“组件”而不是“装饰器”。

(这实际上在 Python 中使用装饰器模块非常简单,但我目前正在学习 C++,甚至不知道从哪里开始寻找这个问题的答案。)

这在我想扩展 Component 类但仍然能够以透明方式使用它的情况下很有用(就好像它不会被扩展一样):

class ExtendDecorator : public Decorator {
  public:
      ExtendDecorator(Component*);
      virtual void doSomething();    

  private:
      void doSomethingMore();
}

void ExtendDecorator::doSomething() {
    Decorator::doSomething();
    doSomethingMore();
}
4

1 回答 1

4

由于在 C++ 中不允许重载运算符 typeid - 我可以建议的唯一解决方案是添加返回 type_info 的虚拟方法用于修饰类型:

class Component {
  public:
      Component();
      virtual void doSomething();
      virtual const std::type_info& decorated_type() const 
      { return typeid(*this); } 
};

class Decorator : public Component {
  public:
      Decorator(Component*);
      virtual void doSomething();
      virtual const std::type_info& decorated_type() const 
      { return typeid(*_component); } 
  private:    
      Component* _component;
};

也许更好的版本Decorator::decorated_type() const

virtual const std::type_info& decorated_type() const 
{ return _component->decorated_type(); } 
于 2012-06-24T20:48:04.033 回答