您的位置 首页 java

从源码角度理解Java设计模式——装饰者模式

一、饰器者模式介绍

装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活。

适用场景:动态的给一个对象添加或者撤销功能。

优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个功能按想要的顺序执行,以实现不同效果。

缺点:更多的类,使程序复杂

类型:结构型。

类图

源码分析中的典型应用

  • Java I/O 中的装饰者模式
  • spring session 中的装饰者模式
  • Mybatis 缓存中的装饰者模式

二、给系统添加日志,安全、限流示例

一般系统的安全、日志、限流等业务无关代码可以抽离出来,在Controller前后用切面改造,模板方法模式可以部分解决这个问题:

在父类中已经把”乱七八糟“的非业务代码写好了,只留了一个抽象方法等子类去实现,子类变的很清爽,只需关注业务逻辑就可以了。

这种方式最大的缺陷就是父类会定义一切:要执行那些非业务代码,以什么顺序执行等等,子类只能无条件接受。如果有一个子类,不限制速率,那么它也没有办法把它去掉。

利用装饰者模式,针对上面的问题,可以变的很灵活。

附加记录日志,安全,限流功能:

测试一下:

运行结果:

——

裸跑代码.+记录日志.+过滤危险字符.+限流.

——

通过上面可以看出,装饰者模式可以任意次序组装功能,是不是很灵活?另外,也可以把上述三个功能封装成注解@Log、@ParamXss、@AccessLimit,实现可拔插。如果读者想看注解功能完整实现,可以参考我的这个项目:SpringBoot+JWT+Shiro+MybatisPlus实现 Restful 快速开发后端脚手架

三、源码中的装饰者模式

3.1、Java IO中是体现最明显的装饰者模式。

它基于字符流( InputStream /OutputStream) 和 字节流(Reader/Writer)作为基类,下面画出InputStream、Reader的部分类图:

这里总结几种常用流的应用场景:

3.2、Spring Session中的ServletRequestWrapper(Response也一样)的装饰者模式。

3.3、Spring Cache中的TransactionAwareCacheDecorator的装饰者模式。

其实从类名就可以看出。

3.4、Mybatis中的装饰者。

Cache为抽象构件类,PerpetualCache为具体构件类,decorators包下的类为装饰类,这里没有抽象装饰类。

参考:

设计模式 | 装饰者模式及典型应用

《码农翻身》刘欣

文章来源:智云一二三科技

文章标题:从源码角度理解Java设计模式——装饰者模式

文章地址:https://www.zhihuclub.com/201211.shtml

关于作者: 智云科技

热门文章

评论已关闭

9条评论

  1. Point nicely applied..
    how to write an about me bio for blog write a descriptive essay on my best friend

  2. Terrific write ups. Thank you!
    write this essay for me what i would like to do for my country essay

  3. You actually explained this superbly!
    what should i do my persuasive essay on who can do my essay for me

  4. You actually expressed this superbly.
    essay writers for cheap i need someone to write a business plan for me

网站地图