为什么80%的码农都做不了架构师?>>>   

前言

装饰者设计模式本来是很常用的模式,常用到随处可见,jdk的bio设计都是遵循这个模式的,偶然的机会发现,貌似jdk中bio的装饰者模式和设计模式中的装饰者设计模式却有点本质上的不同,但是仔细想想,貌似bio的设计貌似还有点违背设计模式的本意,此文中把装饰者模式说成无用,是因为他定义的这种规范的玩法,大家貌似并不遵从,反而更喜欢jdk中的用法。


类图

这个类图大家也并不陌生,具体的被装饰的类和装饰者都是遵循同一个规范,component,此处如果component没有公共的定义方法,那就是妥妥的面向接口编程。看这个用法我们也能猜到怎么用,先创建被装饰的类,然后用装饰类去修饰被装饰的类,然后把引用给component,调用operation的时候就把装饰的效果显示出来,如果需求变更,那么直接把装饰组合出来的过程改改,其他代码不需要改变。


jdk bio的用法

作为装饰者模式的典型,他的类图完全和上面的类图吻合,但是我们的用法却大大不同,我们包装后的IO类,我们很少直接让接口来作为引用,每一个装饰类都带了自己的新特性,API都不一样了。我们想要用包装类的功能就必须使用包装类的引用,否则就切面了,我们能用到的只有接口的方法。他的侧重是不同的包装是不同的功能,类似readline,只有bufferedreader有,我们想用只能依靠这个包装类,但是类本身也遵循接口,所以也能传递给接口,但是要损失包装的特性。


两种用法的对比

单纯从软件设计讲,jdk io的设计扩展性不好,因为你选择包装,本来就是希望调用统一的方法,这样对代码的修改最小。但现实是我们如果不用具体的类无法增加新的功能。也就是说你想体现新的功能的话,后面的代码基本要重写。大家公有的那部分方法压根没有增强到,这样写肯定会带来不小的隐患,但很特殊的是,他设计的是IO,一般读取完就over,有传递的可能性,但是用接口传过去后重新包装一下又可以使用了,反正是各自包装各自的,公有的方法都不用,这样下来反而也没什么影响。要选择这么使用的话一定得慎重,用不好就带来很多麻烦。


适合场景

一看类图,大家基本就能感觉这个更像补救型的模式,就是原来的类都实现好了,现在突然要改需求,给里面的部分类的方法都增加一种或者多种功能,这样装饰者模式就派上用场了,直接在建造对象的地方加一段装饰,当然这个前提都是被装饰的类和装饰的类都是可以估计的,遇到不可估计的情况还是直接用aop动态代理吧,不要再考虑装饰模式。既然是补救行的,那么也是有一定要求的。

起码最初的类图是这样的,要不然还要添加接口等等(这个肯定是不可取的),POJO的话还是用动态代理的好。

另外一种适合情况就是多继承,要对中间继承类需要增加,这种情况用装饰者模式不会影响子类的功能。


和静态代理的区别

其实文中多次提到代理,其实在功能单一的情况下,代理和装饰都可以,我最后想想还是从功能上做点区别,装饰者适合新增的功能可以互相组合的情况,及装饰类和装饰类是可以叠加操作的,并且被装饰的方法还是较少的,装饰的类的个数也是较少的。静态代理更适合类中方法很多,但是只会代理一层,出现多层代理基本就是不合理的,典型的就是datasource中用自己的connection类代理jdbc中的connection类。


最后说几句

其实用装饰者模式带来种种功能上的好处,但是一旦出现问题,你自己写的代码还好,要是让纯粹不知道的人走断点找问题,那跟断点可就费事了,所以一定留好设计文档和把类的名字起的见字生义。

转载于:https://my.oschina.net/xpbob/blog/662292

无用的设计模式之装饰者模式相关推荐

  1. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  2. 前端也要学系列:设计模式之装饰者模式

    什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...

  3. 设计模式 之 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对 ...

  4. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )

    文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...

  5. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  6. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  7. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

  8. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

  9. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

最新文章

  1. Ubuntu下面Master PDF Editor背景颜色设置
  2. oracle11g和12c安装区别,Oracle下载与Oracle安装图解(Oracle19c,Oracle18c,Oracle12c,Oracle11g)...
  3. 索引-jquery-第二版-pyhui
  4. 第2章:Maven的安装/2.1 Window下的安装
  5. 声明式事务java_Spring声明式事务管理源码解读之事务开始
  6. Cocos2d-x动画播放(序列帧)
  7. UVALive 6508 Permutation Graphs
  8. C#进行MapX二次开发之地图搜索
  9. 手脱ASPack2.12壳(练习)
  10. apk很小 白屏时间长_小精灵启动后会白屏很久
  11. 怎么将整个英文的pdf文档翻译成中文
  12. 导数与微分 — 高等数学
  13. 两台笔记本通过蓝牙传输文件
  14. POJ 3164 Command Network(朱刘算法)
  15. MySQL之where查询
  16. 服务器监控cacti
  17. 微信小程序登录及请求封装
  18. Window server 2008 R2 无法安装tools 解决办法
  19. daemontools安装及使用技巧
  20. java excel 写入与下载实现 (解决乱码问题)

热门文章

  1. [Xcode 实际操作]六、媒体与动画-(6)使用UIBlurEffect给图片添加模糊效果
  2. SPI接口比IIC速度快的理解
  3. PostgreSQL安装和简单配置
  4. 【BZOJ 4170】 4170: 极光 (CDQ分治)
  5. Javascript模块模式学习分享
  6. osgdem的参数表(转)
  7. iOS中监测来电方案
  8. 《大道至简》第一章伪代码
  9. Golang 处理 Json(二):解码
  10. 是什么时候开始学习gulp了