本文共 2573 字,大约阅读时间需要 8 分钟。
装饰者模式(Decorator Pattern)
是一种结构型
模式,原理是创建了一个装饰类,用来包装原有的类,并在保持类方法完整性的前提下,提供了额外的功能。
基于装饰者模式实现一级,二级缓存,首先创建缓存接口,声明方法
public interface ICache { public Object getCache(String key); }
创建一级缓存
public class OneLevelCache implements ICache { MaponeLevelCacheMap = new HashMap<>(32); @Override public Object getCache(String key) { //1、查询一级缓存 System.out.println(">>>查询一级缓存>>>"); Object value = oneLevelCacheMap.get(key); if (value == null) { System.out.println("一级缓存为空......"); //2、一级缓存没有去数据库查询,再放入缓存 System.out.println(">>>查询数据库>>>"); System.out.println(">>>放入一级缓存>>>"); oneLevelCacheMap.put("hly", 123456); } return oneLevelCacheMap.get(key); }}
创建装饰者抽象接口
public abstract class AbstractDecorator implements ICache{ public OneLevelCache oneLevelCache; public AbstractDecorator(OneLevelCache oneLevelCache) { this.oneLevelCache = oneLevelCache; } @Override public Object getCache(String key) { return oneLevelCache.getCache(key); }}
二级缓存继承装饰者
public class TwoLevelCache extends AbstractDecorator { MaptwoLevelCacheMap = new HashMap<>(32); public TwoLevelCache(OneLevelCache oneLevelCache) { super(oneLevelCache); } @Override public Object getCache(String key) { //1、查询二级缓存 System.out.println(">>>查询二级缓存>>>"); Object twoValue = twoLevelCacheMap.get(key); //2、二级缓存没有查询一级缓存 if (twoValue == null) { System.out.println("二级缓存为空......"); Object oneValue = super.getCache(key); if (oneValue != null) { ; //3、把二级缓存放到一级缓存中 twoLevelCacheMap.put(key, oneValue); twoValue = oneValue; } } return twoValue; }}
测试结果
public class Main { public static void main(String[] args) { AbstractDecorator cache = new TwoLevelCache(new OneLevelCache()); System.out.println("查询结果:" + cache.getCache("hly")); System.out.println("查询结果:" + cache.getCache("hly")); }}
>>>查询二级缓存>>>二级缓存为空......>>>查询一级缓存>>>一级缓存为空......>>>查询数据库>>>>>>放入一级缓存>>>查询结果:123456>>>查询二级缓存>>>查询结果:123456
特点
优点:
1、装饰类和被装饰类可以独立发展,不会相互耦合。 2、装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。缺点:
1、多层装饰比较复杂。场景
1、扩展一个类的功能。 2、动态增加功能,动态撤销。 3、多级缓存的实现问题
1、装饰者和代理的区别? 1、装饰者和被装饰者都实现同一个接口,代理类和目标类都实现同一个接口 2、代理模式在方法之前,之后进行处理,对方法进行增强,隐藏真实性;装饰者是不改变原有的功能进行增强,不断增加装饰。 3、使用场景不一样,实现多级缓存可以使用装饰者,实现AOP的功能可以使用代理—— 完
公众号:【星尘Pro】
github:
推荐阅读
https://www.runoob.com/design-pattern/decorator-pattern.html
转载地址:http://fffsi.baihongyu.com/