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