装饰器模式通过包装ApiInvoker接口实现在不侵入业务逻辑前提下动态添加缓存等功能,支持日志、鉴权等自由组合;定义统一接口契约确保透明性,基础执行器专注核心逻辑,缓存装饰器封装策略并可灵活链式组装与运行时控制。

装饰器模式为 API 接口动态添加缓存,核心是不侵入原有业务逻辑,通过“包装”方式在调用前后插入缓存读写逻辑,且支持与其他增强功能(如日志、鉴权)自由组合。
明确接口契约,定义统一能力入口
首先定义一个标准的 API 接口抽象,比如 ApiInvoker:
- 声明统一方法(如
invoke(Request req)),所有真实接口和装饰器都实现它 - 确保调用方只依赖该接口,不关心内部是原始服务还是被装饰过的实例
- 这是透明性的基础——客户端代码完全无需改动
实现基础 API 执行器
写一个最简版本的真实调用逻辑,例如:
-
ProductQueryApi实现ApiInvoker,直接查数据库或远程服务 - 它只专注一件事:返回正确结果,不处理缓存、日志等横切逻辑
- 这个类今后永远不变,后续所有扩展都绕开它
编写缓存装饰器
创建一个具体装饰器类,例如 CacheApiDecorator:
- 构造时接收一个
ApiInvoker(可以是原始 API,也可以是其他装饰器) -
invoke()方法中先查缓存(如基于请求参数生成 key) - 命中则直接返回;未命中则调用被装饰对象,再将结果写入缓存(可设 TTL)
- 缓存策略(LRU、本地 Map、Redis)封装在装饰器内部,对外无感
灵活组装与运行时控制
缓存不是硬编码,而是按需装配:
- 开发环境:直接用
new ProductQueryApi(),无缓存 - 线上环境:用
new CacheApiDecorator(new ProductQueryApi()) - 需要日志+缓存?链式组装:
new LogApiDecorator(new CacheApiDecorator(new ProductQueryApi())) - 甚至可通过配置中心动态开关某层装饰器,比如临时禁用缓存做问题排查


















