装饰模式对象组合的特点:
- 1、装饰类和被装饰类继承同样的父类,或者实现相同的接口
- 2、装饰类的作用是进行功能的增强而不是提供额外的功能
Mybatis 中的装饰器
Mybaits 中基础支持层提供有缓存组件功能,而缓存组件功能的实现就是以装饰者模式实现的,如下图:
所有缓存的组件都实现自同一个接口 Cache
。
所有缓存组件中,最基础的组件实现就是 PerpetualCache
如上图, PerpetualCache
直接通过 HashMap
容器实现的缓存功能,也是最基础不具备任何功能的缓存。
线程安全的缓存组件
基础缓存组件 PerpetualCache
无法提供线程安全功能,Mybatis 使用装饰者的模式,在此基础上实现了线程安全功能的装饰类SynchronizedCache
,代码如下:
代码本身不具备缓存能力,只是对具有缓存能力的类进行功能的增强。
具有 LRU 功能的缓存组件
基础缓存组件 PerpetualCache
无法提供 LRU 算法功能,Mybaits 使用装饰者模式,提供了 LRU 算法功能,LruCache
代码如下:
同样的 LruCache
本身不具备缓存能力,只是对于有缓存能力的类进行功能增强。
以此类推,需要啥功能就使用装饰者模式增加功能即可,Mybatis 还实现了具有日志打印功能的 LoggingCache
,周期性清除缓存功能的 ScheduledCache
上述的缓存功能,如 LRU,线程安全,不仅仅适用于基础缓存组件 PerpetualCache
,而是适用于任何一个具有缓存能力的缓存组件,
比如:一个同时具有 LRU ,线程安全,日志打印功能的缓存组件,如下图:
同理,如果需要在追加功能,只需要在增加一个装饰类,然后在往缓存组件外层套用即可。
【公众号】花好夜猿