一、装饰模式介绍

装饰模式(Decorator Design)属于结构型模式,也是一种通过组合不同的对象实现的设计模式。

装饰模式对象组合的特点:
1、装饰类和被装饰类继承同样的父类,或者实现相同的接口
2、装饰类的作用是进行功能的增强而不是提供额外的功能。

二、装饰模式案例(使用套路)

通过使用装饰器模式实现一组简单的缓存组件,来演示装饰模式。

具体代码实现类结构图如下

[设计模式]-[结构型]-装饰-介绍 - 图1

在上述代码中只有 LocalCache.java 真正实现了缓存功能,而其他的两个类SynchronizedCache.javaCountMetricsCache.java. 本身并不具备缓存功能,但是他们为基础缓存分别提供了线程安全功能缓存命中计算功能
当我们把缓存类(如:LocalCache)和附加的功能类(如:SynchronizedCache、CountMetricsCache)组合成具有相应功能的缓存类,这种组合模式就是装饰者模式。
来看一下具体的代码实现,就一目了然了。
具体实现的功能类(如:LocalCache) 叫做被装饰类,增强功能(如:SynchronizedCache、CountMetricsCache)叫做装饰类
LocalCache 相关代码如下
[设计模式]-[结构型]-装饰-介绍 - 图2

缓存功能实现,依赖于容器 HashMap
再来看 SynchronizedCache 功能增强装饰类的代码,如下图:
[设计模式]-[结构型]-装饰-介绍 - 图3
从代码中能够知道 SynchronizedCache 只对被装饰类增强了线程安全问题,并没有实现缓存功能。

CountMetricsCache 实现也一样
[设计模式]-[结构型]-装饰-介绍 - 图4

如上述代码,CountMetricsCache 本身也并不提供有缓存功能,仅提供了缓存命中的计算功能,具体的缓存实现仍然是由被装饰类来实现。
装饰模式可以不断的往原始功能上进行功能的增强,就和套娃一样。
下面演示一下缓存功能的组合操作,来看一下装饰模式的威力,
案例:需要两个缓存功能实现,一个只提供基础缓存能力,
一个需要具备线程安全和命中率统计的功能
相关代码实现如下图:
[设计模式]-[结构型]-装饰-介绍 - 图5

针对缓存实现类,如:LocalCache ,其本身只提供了单一的缓存能力,通过装饰模式,能够在改变原有代码的基础上,不断的对基础缓存实现追加功能。
比如:线程安全,命中率统计,LRU算法等。
同时该功能的追加可以叠加,可以通过装饰模式,类似于套娃的方式,在不改变原本基础缓存实现类的前提下,不断的追加新的缓存功能。


【公众号】花好夜猿
wxlogo.jpg