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