使用C ++签名保留装饰器模式?

时间:2012-06-24 18:05:00

标签: c++ design-patterns boost stl decorator

我想在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;

它打印&#34;组件&#34;而不是&#34;装饰者&#34;。

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

如果我想扩展Component类但仍然能够以透明的方式使用它(就好像它不会被扩展),这很有用:

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

  private:
      void doSomethingMore();
}

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

1 个答案:

答案 0 :(得分: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(); }