zoukankan      html  css  js  c++  java
  • Decorator

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

    2 别名:包装器Wrapper

    3 动机:将组件嵌入到另一个对象中,由这个对象添加边框。嵌入的对象叫做装饰。装饰的接口与所装饰的组件接口一致,因此对客户透明。

               由于透明,可以递归嵌套多个装饰,添加任意多的功能。

    4 适用性:

       . 不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

       . 处理那些可以撤销的职责

       . 当不能采用生成子类的方式扩充时。大量独立的扩展,为支持每一种组合将产生大量的子类。

         一种情况,有大量独立的扩展,为支持每一种组合将产生大量子类,子类数目爆炸性增长。

         另一种情况,因为类定义被隐藏,类定义不能生成子类。

    5 参与者:

       . Component 定义一个对象接口,可以给这些对象动态添加职责

       . ConcreteComponent:定义一个对象,给这个对象添加一些职责

       . Decrator:为之一个指向Component对象的指针,定义一个与Component接口一致的接口。

       . ConcreteDecrator:向组件添加职责

    6 协作:

      Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

    7 效果:

       优点:

       1)比静态继承更灵活

       2)避免在层次结构高层的类有太多的特征

       3)Decorator与Component不一样

       4)有许多小对象

    8 实现:

       1)接口的一致性

       2)省略抽象的Decorator

       3)保持Component类的简单性

       4)改变对象外壳与改变对象内核

    9 相关模式:

       . Adapter只改变接口,Decorator仅改变职责

       . Composite模式:可将装饰视为只有一个退化的、仅有一个组件的组合。

       . Strategy改变对象的内核, Decorator改变对象的外壳

       

  • 相关阅读:
    浅入了解GCD 并发 并行 同步 异步 多线程
    XSD
    想在Images.xcassets 只能用 imageNamed 加载里边的素材 其他方法 你就别费老劲了
    如何在SCENEKIT使用SWIFT RUNTIME动态加载COLLADA文件
    编译 wxWidgets3.0.2 on Mac OS X Yosemite 出错?!的解决方法
    3、技术积累方面总结
    2、日常计划管理总结
    站在客户的角度考虑问题
    公司管理的一点思虑
    项目管理一定要规范阿
  • 原文地址:https://www.cnblogs.com/criticalsection/p/5717328.html
Copyright © 2011-2022 走看看