zoukankan      html  css  js  c++  java
  • 装饰器模式

    装饰器模式 
    整理自 《java与模式》阎宏编著 


    1.意图: 

        在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。 

    2.类图: 
         

    3.原理: 
          在一个对象的外围创建一个称为装饰器的封装,动态地给这个对象添加一些额外的功能。以对客户端透明的方式扩展对象的功能。 
           装饰器模式又称为包裹模式(wrapper),因为一个具体装饰器都将下一个具体装饰器或具体构件类包裹起来。如有三个装饰器类Decorator1, Decorator2, Decorator3,它们的典型的创建过程为new Decorator1(new Decorator2(new Decorator3(new ConcreteComponent()))). 

        这样Decorator1包裹了Decorator2,Decorator2包裹了Decorator3,Decorator3包裹了ConcreteComponent对象,每一层包裹都提供了新的功能。如图: 
        

    4.特征: 

        装饰器角色持有一个构件对象的实例,并实现了抽象构件的接口。每一个接口的实现都是委派给所持有的构件对象,并增加新的功能。 
    5.说明: 

        优点: 

        装饰器与继承的目的都是扩展对象的功能,但装饰器提供了比继承更大的灵活性,可以动态的决定是“粘上”还是“去掉”一个装饰。 
          通过使用不同的具体装饰类和这些类的排列组合,可以创建出很多不同行为的组合。 

        缺点: 

        装饰器比继承关系使用更少的类,但比继承关系使用更多的对象,更多的对象会使查错变得更困难,特别是这些对象看上去很像的时候。 



        模式的简化: 
          简化必须注意两点: 

        a.一个装饰器类的接口必须与被装饰的类的接口相容。 

        b.尽量保持Component作为一个“轻”类。 

        Component类的职责在于为各个具体装饰器类提供共同的接口,而不是存储数据,所以不要把太多的逻辑和状态放在Component类里面。 

        省略Component接口,只有一个具体的ConcreteComponent类,则Decorater经常作为ConcreteComponent的子类。如图: 

         


        省略Decorator类,如果只有一个具体的ConcreteDecorator类,那可以省略Decorator,将ConcreteDecorator和Decorator角色的职责合并在一起。如图: 
        

  • 相关阅读:
    使用Docker-compose部署MySQL测试环境
    使用MySQL SQL线程回放Binlog实现恢复
    MySQL 插件之 连接控制插件(Connection-Control)
    sysbench工具使用
    故障分析--主从复制故障1
    MySQL性能指标计算方式
    AJAX的 同步异步;EZView.js 图片预览和pdf预览
    Caused by: java.lang.ClassNotFoundException: org.springframework.context.App
    解决Myeclipse或Eclipse出现JPA project Change Event Handler问题的解决办法
    java中转换为string的方法;eques和==区别
  • 原文地址:https://www.cnblogs.com/byfei/p/2984574.html
Copyright © 2011-2022 走看看