专栏首页技术点滴装饰者模式(Decorator)

装饰者模式(Decorator)

装饰者模式(Decorator)

装饰者模式(Decorator)[Wrapper]

意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。

应用:给GUI组件添加功能等。

模式结构

心得

装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口,这个统一的接口正是被装饰对象需要扩展功能的地方,因此它们需要一个共同的接口(AbstractComponent)。另外为了完成装饰的目的,装饰器需要包含被装饰的对象,装饰器不直接包含被装饰对象,而是包含它们统一接口的引用,这样通过多态机制可以实现多层装饰。注意装饰器对抽象接口的关系是一对一的,这和组合模式很像,但是一对一的关系决定了装饰器一次只能装饰一个对象,这种关系正是我们想要的。装饰器为被装饰对象添加功能通过调用被装饰对象的统一接口实现,如果装饰器需要复杂的扩展,我们通过继承装饰器实现具体的装饰器(ConcreteDecorator),具体的装饰器可以扩展数据(addedState),也可以扩展接口功能(addedBehavior)。

举例

被装饰的对象假如是一块蛋糕,装饰器就是为蛋糕添加额外的属性,比如加上一朵花等。统一接口为了简单我们输出装饰后蛋糕的名字,那么装饰器的统一接口operation实现时就需要调用被装饰对象的operation,然后添加额外的名字。C++代码实现如下:

class AbstractComponent
{
public:
 virtual string operation()=0;
 virtual ~AbstractComponent(){}
};
class ConcreteComponent:public AbstractComponent
{
public:
 virtual string operation()
    {
 return "基本对象";
    }
};
class Decorator:public AbstractComponent
{
protected:
    AbstractComponent*pAbsComponent;
public:
    Decorator(AbstractComponent*pac):pAbsComponent(pac){}
 virtual~Decorator()
    {
        delete pAbsComponent;
    }
};
class ConcreteDecorator:public Decorator
{
public:
    ConcreteDecorator(AbstractComponent*pac):Decorator(pac){}
 virtual string operation()
    {
 string str="装饰后的";
        str+=pAbsComponent->operation();
 return str;
    }
};

用户使用起来代码如下:

AbstractComponent*pac=
 new ConcreteDecorator(
 new ConcreteDecorator(
 new ConcreteComponent()
    ));
cout<<pac->operation().c_str()<<endl;
delete pac;

从使用装饰者模式的代码来看,装饰器对对象的操作就像包装一样,一层层的为对象扩展功能,而且装饰器装饰后的对象仍然可以被装饰。

参考文章http://www.iteye.com/topic/335521

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从实现装饰者模式中思考C++指针和引用的选择

    从实现装饰者模式中思考C++指针和引用的选择 最近在看设计模式的内容,偶然间手痒就写了一个“装饰者”模式的一个实例。该实例来源于风雪涟漪的博客,我对它做了简化。...

    Florian
  • 关于如何评价洗牌质量的猜想

    关于如何评价洗牌质量的猜想 洗牌算法是卡牌类游戏中必须使用的算法,本质上说洗牌算法的目的是使某个给定的顺序更加的无序,因此出现了很多种洗牌算法。我们不重点讨论如...

    Florian
  • 命令模式(Command)

    命令模式(Command) 命令模式(Command)[Action/Transaction] 意图:将一个请求封装为一个对象,从而可用不同的请求对客户参数化。...

    Florian
  • Java IO 装饰者模式

      装饰模式以对客户端透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。

    intsmaze-刘洋
  • 23种设计模式之装饰模式

    定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说, 装饰模式相比生成子类更为灵活.

    烟草的香味
  • 设计模式~装饰模式

    3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

    Vincent-yuan
  • java设计模式之装饰者模式

    Tanyboye
  • Python装饰器(Decorate)使

    Python装饰器其实就是一个返回值为函数的高阶函数,其中至少嵌套一个函数(作为返回值返回)。

    py3study
  • 装饰者模式

     装饰器模式 动态地给一个对象添加一些额外的职责,装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。 装饰器...

    xiangzhihong
  • 设计模式快速学习(一)

    UML类图 ? 简单工厂模式 1.1类图 ? 策略模式 2.1策略模式结构图 ? 2.2策略模式解析 策略模式时一种定义一系列算法的方法,从概念上看,所有这...

    码农阿宇

扫码关注云+社区

领取腾讯云代金券