java基础巩固-宇宙第一AiYWM:为了维持生计,装饰者模式阅读总结Part1~整起

java基础巩固-宇宙第一AiYWM:为了维持生计,装饰者模式阅读总结Part1~整起_第1张图片
java基础巩固-宇宙第一AiYWM:为了维持生计,装饰者模式阅读总结Part1~整起_第2张图片

  • 装饰器(Decorator)模式 可以在不改变原有对象的情况下拓展其功能。
    • 举个不太恰当的例子,
      • 比如穿个很硬很硬的盔甲或者左手拿倚天剑右手拿屠龙刀,这就是在“装饰”你自己,至于目的是变强变好看在你,可以说是 盔甲、倚天剑和屠龙刀罩着咱呢
      • 比如,你对身体构造或者基因等进行了医学改造从而变强变美,这就算是装饰者模式
    • 装饰器模式通过 组合替代继承 来扩展原始类的功能,在一些继承关系比较复杂的场景(IO 这一场景各种类的继承关系就比较复杂)更加实用,
      • 对于字节流来说, FilterInputStream (对应输入流)和FilterOutputStream(对应输出流)是装饰器模式的核心,分别用于增强 InputStream 和OutputStream子类对象的功能
        • 常见的BufferedInputStream(字节缓冲输入流)、DataInputStream 等等都是FilterInputStream 的子类,BufferedOutputStream(字节缓冲输出流)、DataOutputStream等等都是FilterOutputStream的子类
        • 比如,通过 BufferedInputStream(字节缓冲输入流)来增强 FileInputStream 的功能。BufferedInputStream罩着FileInputStream
          java基础巩固-宇宙第一AiYWM:为了维持生计,装饰者模式阅读总结Part1~整起_第3张图片
          • 为啥我们直接不弄一个BufferedFileInputStream(字符缓冲文件输入流)子类出来呢?如果 InputStream的子类比较少的话,这样做是没问题的。不过, InputStream的子类实在太多,继承关系也太复杂了。如果我们为每一个子类都定制一个对应的缓冲输入流,那岂不是太麻烦了
      • 装饰器模式很重要的一个特征,那就是可以对原始类嵌套使用多个装饰器,一个小弟可以被很多个老大罩着呀
      • 为了实现装饰器模式,装饰器类需要跟原始类继承相同的抽象类或者实现相同的接口。上面介绍到的这些 IO 相关的装饰类和原始类共同的父类是 InputStream 和OutputStream。
      • 装饰器模式是对被装饰类的功能增强,在不修改被装饰类的前提下,能够为被装饰类添加新的功能特性当我们需要为一个类扩展功能时会使用装饰器模式,但是该模式的缺点是需要增加额外的代码
        java基础巩固-宇宙第一AiYWM:为了维持生计,装饰者模式阅读总结Part1~整起_第4张图片
        • Netty 中 WrappedByteBuf 是如何装饰 ByteBuf 的:
          java基础巩固-宇宙第一AiYWM:为了维持生计,装饰者模式阅读总结Part1~整起_第5张图片
        • WrappedByteBuf 有两个子类 UnreleasableByteBuf 和 SimpleLeakAwareByteBuf,它们是真正实现对 ByteBuf 的功能增强,例如 UnreleasableByteBuf 类的 release() 方法是直接返回 false 表示不可被释放
          java基础巩固-宇宙第一AiYWM:为了维持生计,装饰者模式阅读总结Part1~整起_第6张图片

未完待续…

巨人的肩膀
javaGuide
设计模式之禅
Head First设计模式

你可能感兴趣的:(设计模式~学了个学,设计模式,装饰者模式)