一、饰器者模式介绍
装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活。
适用场景:动态的给一个对象添加或者撤销功能。
优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个功能按想要的顺序执行,以实现不同效果。
缺点:更多的类,使程序复杂
类型:结构型。
类图 :
源码分析中的典型应用
- 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包下的类为装饰类,这里没有抽象装饰类。
参考:
设计模式 | 装饰者模式及典型应用
《码农翻身》刘欣
With thanks! I value this.
blog writing services packages custom essays for sale
Kudos! A good amount of posts!
buy a term paper apa research paper proposal
Point nicely applied..
how to write an about me bio for blog write a descriptive essay on my best friend
You explained it superbly.
best websites to buy essays
Terrific write ups. Thank you!
write this essay for me what i would like to do for my country essay
You actually explained this superbly!
what should i do my persuasive essay on who can do my essay for me
Awesome material, Regards!
red dog online casino online casino bonus code
Fantastic content. With thanks.
pay somebody to do my essay university essay writer
You actually expressed this superbly.
essay writers for cheap i need someone to write a business plan for me