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

九、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
    )
);

 

个人理解:

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

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值