c++ - C++ 中的签名保留装饰器模式?

标签 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;

它打印“Component”而不是“Decorator”。

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

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

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

  private:
      void doSomethingMore();
}

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

最佳答案

由于在 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(); } 

关于c++ - C++ 中的签名保留装饰器模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11179914/

相关文章:

c# - 代码块后自动调用方法

python - 处理 pybind11 中的不透明指针

C++ ReadDirectoryChangesW 和 Boost 将目录更改作为文件(旧名称)返回

c++ - 在C++中如何从字符串中获取字母

c++ - unordered_map 具有三个元素

c++ - 片段着色器中设置的颜色未显示 GLSL 1.30

c++ - 前馈神经网络线性函数

java - 可观察类可以构造为单例吗?

java - 我应该使用哪种设计模式在 java 中构建 GUI 以及以下场景?

C++ boost 日志记录 : how to zip logs?