装饰模式的核心思想是:在不修改原类文件、不使用继承的前提下,通过创建一个包装对象(即"装饰")来动态扩展一个对象的功能。
当需要给已有的类添加功能时,如果用继承来实现,会增加系统的复杂性和继承层次深度。装饰模式的做法是通过组合而非继承来达到目的。
《代码大全》中有这样一个场景:一个功能复杂而齐全的类,但我只需要其中部分接口和功能,这时就可以通过装饰模式包装出一个新类。
class Component
{
public:
virtual void Operation() = 0;
};
class ConCreateComponent :public Component
{
public:
virtual void Operation()override
{
}
};
class Decorator :public Component
{
public:
virtual void Operation()override
{
}
};
class ConCreateDecorator :public Decorator
{
public:
virtual void Operation()override
{
_component->Operation();
this->AddedBehavior();
}
void AddedBehavior()
{
cout << __FUNCTION__ << endl;
}
ConCreateDecorator(Component*com)
{
this->_component = com;
}
private:
Component* _component;
};
int main(int argc, char *argv[])
{
Decorator* dec = new ConCreateDecorator(new ConCreateComponent);
dec->Operation();
system("pause");
return 0;
}