Decorator模式
一.意图
动态的给一个对象添加一些额外的职责.就增加功能来说,decorator模式相比生成子类更为灵活.
二.适用性
1. 在不影响其他对象的情况下,以动态透明的方式给单个对象添加职责
2. 处理那些可以撤销的职责
3. 当不能采用生成子类的方法进行扩充时,一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长.另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类.
三.结构
四.优点
不必重写任何已有的功能性代码,而是对某个基于对象应用增量变化.
Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力.
五.代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
usingnamespacestd;
//decorator mode
classCComponent
{
public:
virtualvoiddraw(){}
};
//基本功能
classCBasicDraw:publicCComponent
{
public:
virtualvoiddraw()
{
cout<<"drawbasic"<<endl;
}
};
//添加装饰接口
classCDecorator:publicCComponent
{
public:
CComponent*m_pComponent;
CDecorator(CComponent*component)
{
m_pComponent=component;
}
virtualvoiddraw()
{
m_pComponent->draw();
}
virtualvoiddoOtherDraw(){}
};
//实现描画按键接口
classCDecoratorButton:publicCDecorator
{
public:
CDecoratorButton(CComponent*component):CDecorator(component){}
virtualvoiddoOtherDraw()
{
cout<<"Button:drawotherthings"<<endl;
}
};
intmain()
{
cout<<"HelloWorld!"<<endl;
CComponent*basic=newCBasicDraw();
CDecoratorButton*button=newCDecoratorButton(basic);
cout<<"drawbutton-----------"<<endl;
button->draw();
button->doOtherDraw();
return0;
}