设计模式学习笔记(十)——Decorator装饰

本文通过一个具体的代码示例,介绍了装饰模式的基本概念及其应用场景。装饰模式允许程序员动态地给一个对象添加新的职责,而不改变原有对象的结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

九、Decorator(装饰)

情景举例:

动态地给一个对象添加一些额外的职责。

代码示例:

/* 装饰与待装饰类共同的抽象类
*/
class VisualComponent {
public:
    VisualComponent();
 
    virtual void Draw();
    virtual void Resize();
    // ...
};
/* 装饰的抽象类。注意成员变量_component
* 它指向的是下一层装饰或者待装饰类
*/
class Decorator : public VisualComponent {
public:
    Decorator(VisualComponent*);
/*
*/
    virtual void Draw();
    virtual void Resize();
    // ...
private:
    VisualComponent* _component;
};
/* 将请求转发给下一层装饰或者待装饰类
*/
void Decorator::Draw () {
    _component->Draw();
}
 
void Decorator::Resize () {
    _component->Resize();
}
/*
*/
class BorderDecorator : public Decorator {
public:
    BorderDecorator(VisualComponent*, int borderWidth);
 
    virtual void Draw();
private:
    void DrawBorder(int);
private:
    int _width;
};
/* 注意,执行装饰时,一定要考虑到其他的装饰操作
 * Decorator::Draw();转发
*/
void BorderDecorator::Draw () {
    Decorator::Draw();
    DrawBorder(_width);
}
/* 这里注意下装饰类和其子类的构造函数
*/
class ScrollDecorator : public Decorator {
public:
    ScrollDecorator(VisualComponent*);
};
/* 
*/
class TextView : public VisualComponent {
};
/* 测试用类,与结构无关
*/
class Window {
  public:
    void SetContents (VisualComponent* contents);
};
void Window::SetContents (VisualComponent* contents) {
    // ...
}
void dummy()  
{
Window* window = new Window;
TextView* textView = new TextView;
/*
*/
window->SetContents(textView);
/* 注意装饰的用法
*/
window->SetContents(
    new BorderDecorator(
        new ScrollDecorator(textView), 1
    )
);

 

个人理解:

装饰模式的结构可以理解为一个只有一个组件的组合模式。装饰类与待装饰类共同拥有一个抽象父类。注意装饰类的构造函数和其私有成员变量,巧妙的运用来达成动态装饰的目的(例子中具体描述了这一技巧)。另外,每个装饰的操作在完成自己定义的装饰外,一定要转发操作来考虑到其他的装饰(见例子)。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值