意图:动态的为一个对象添加一些额外的职责,Decorator比子类更加灵活
示例图:
适用性:
在不影响对象的情况下,以动态,透明的方式给单个对象添加职责
处理那些可以撤销的职责
但不能使用子类进行扩充时/类被隐藏/类定义不能生成子类…
注意事项:
装饰对象的接口必须与它所装饰的Component的接口一致
示例代码:
//Compnent同时也是基类
class CText
{
public:
CText(void);
public:
~CText(void);
public:
//绘制接口
virtual void Draw()
{
_tprintf(_T("Pure
Text/n"));
}
};
//Decorator拥有相同的接口
class CTextDecorator:public CText
{
public:
CTextDecorator(CText* pCompnent);
public:
~CTextDecorator(void);
public:
//相同的绘制接口
virtual void Draw()
{
//添加装饰
DrawLine();
m_pText->Draw();
DrawLine();
}
protected:
//自定义的装饰行为
virtual
void DrawLine()
{
_tprintf(_T("--------Decorator------/n"));
}
private:
CText *m_pText;
};
//客户调用端用于绘制显示文字
CText text;//待装饰对象
CTextDecorator textDec(&text);//装饰对象
CClient
client;
client.DrawText(&text);//客户显示文字信息
client.DrawText(&textDec);//显示装饰之后的文字信息