一、装饰模式介绍
装饰模式(Decorator Design)属于结构型模式,也是一种通过组合不同的对象实现的设计模式。
装饰模式对象组合的特点:
1、装饰类和被装饰类继承同样的父类,或者实现相同的接口
2、装饰类的作用是进行功能的增强而不是提供额外的功能。
二、装饰模式案例(使用套路)
通过使用装饰器模式实现一组简单的缓存组件,来演示装饰模式。
具体代码实现类结构图如下
![[设计模式]-[结构型]-装饰-介绍 - 图1](/uploads/projects/it-learn@java-base/4b564b362b9fee88a47c4bfeec432db0.webp)
在上述代码中只有 LocalCache.java 真正实现了缓存功能,而其他的两个类SynchronizedCache.java 和 CountMetricsCache.java. 本身并不具备缓存功能,但是他们为基础缓存分别提供了线程安全功能和缓存命中计算功能。
当我们把缓存类(如:LocalCache)和附加的功能类(如:SynchronizedCache、CountMetricsCache)组合成具有相应功能的缓存类,这种组合模式就是装饰者模式。
来看一下具体的代码实现,就一目了然了。
具体实现的功能类(如:LocalCache) 叫做被装饰类,增强功能(如:SynchronizedCache、CountMetricsCache)叫做装饰类。LocalCache 相关代码如下![[设计模式]-[结构型]-装饰-介绍 - 图2](/uploads/projects/it-learn@java-base/cee5e023e3602402df49d026a8c595cc.webp)
缓存功能实现,依赖于容器 HashMap 。
再来看 SynchronizedCache 功能增强装饰类的代码,如下图:![[设计模式]-[结构型]-装饰-介绍 - 图3](/uploads/projects/it-learn@java-base/c8278131c9c203fc03ccc8a7e9de5c2b.webp)
从代码中能够知道 SynchronizedCache 只对被装饰类增强了线程安全问题,并没有实现缓存功能。
CountMetricsCache 实现也一样![[设计模式]-[结构型]-装饰-介绍 - 图4](/uploads/projects/it-learn@java-base/99d02f0a42f889ca6166f6cd8acdce86.webp)
如上述代码,CountMetricsCache 本身也并不提供有缓存功能,仅提供了缓存命中的计算功能,具体的缓存实现仍然是由被装饰类来实现。
装饰模式可以不断的往原始功能上进行功能的增强,就和套娃一样。
下面演示一下缓存功能的组合操作,来看一下装饰模式的威力,
案例:需要两个缓存功能实现,一个只提供基础缓存能力,
一个需要具备线程安全和命中率统计的功能
相关代码实现如下图:![[设计模式]-[结构型]-装饰-介绍 - 图5](/uploads/projects/it-learn@java-base/52ee70a2d6274f453a4905419cdce2d5.webp)
针对缓存实现类,如:LocalCache ,其本身只提供了单一的缓存能力,通过装饰模式,能够在改变原有代码的基础上,不断的对基础缓存实现追加功能。
比如:线程安全,命中率统计,LRU算法等。
同时该功能的追加可以叠加,可以通过装饰模式,类似于套娃的方式,在不改变原本基础缓存实现类的前提下,不断的追加新的缓存功能。
【公众号】花好夜猿
