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