java中装饰模式

目录

一 装饰模式案例说明

1.1 说明

1.2 代码

1.2.1 定义数据服务接口

1.2.2 定义基础数据库服务实现

1.2.3  日志装饰器

1.2.4 缓存装饰器

1.2.5 主程序调用

1.3 装饰模式的特点


一 装饰模式案例说明

1.1 说明

本案例是:数据查询增加缓存,使用到了装饰模式

1.装饰器链构建

new CachingDecorator(new LoggingDecorator(new DatabaseService()))

2.顺序是:缓存装饰器包裹日志装饰器,日志装饰器包裹基础数据库服务

3.流程

  1. 第一次查询 (user_123):

    • 进入缓存装饰器:缓存中没有,继续向下

    • 进入日志装饰器:记录开始日志

    • 进入数据库服务:执行实际查询

    • 返回日志装饰器:记录完成日志

    • 返回缓存装饰器:缓存结果

    • 最终返回结果给主程序

  2. 第二次查询 (user_123):

    • 缓存装饰器发现缓存中存在,直接返回

    • 不会触发日志和数据库查询

1.2 代码

1.2.1 定义数据服务接口

public interface DataService {String fetchData(String userId);
}

1.2.2 定义基础数据库服务实现

public class DatabaseService implements DataService {@Overridepublic String fetchData(String userId) {// Simulate fetching data from a databasereturn "db中数据00: " + userId;}
}

1.2.3  日志装饰器

public class LoggingDecorator  implements DataService {private final DataService wrappedService;public LoggingDecorator(DataService wrappedService) {this.wrappedService = wrappedService;}@Overridepublic String fetchData(String userId) {System.out.println("查询db中内容: " + userId);String result = wrappedService.fetchData(userId);System.out.println("logging查询db: " + result);return result;}
}

1.2.4 缓存装饰器

public class CachingDecorator implements DataService {private final DataService wrappedService;private final Map<String, String> cache = new HashMap<>();public CachingDecorator(DataService wrappedService) {this.wrappedService = wrappedService;}@Overridepublic String fetchData(String userId) {if (cache.containsKey(userId)) {System.out.println("查询缓存获取内容: " + userId);return cache.get(userId);} else {String result = wrappedService.fetchData(userId);cache.put(userId, result);return result;}}
}

1.2.5 主程序调用

public class TestZs {public static void main(String[] args) {DataService service = new CachingDecorator(new LoggingDecorator(new DatabaseService()));String result = service.fetchData("user_123");System.out.println("main方法显示结果:"+result);System.out.println("====================");// Fetching again to demonstrate cachingresult = service.fetchData("user_123");System.out.println(result);}
}

结果:

1.3 装饰模式的特点

关键点说明
装饰器顺序很重要:

如果把缓存装饰器放在最内层,日志每次都会记录

当前顺序确保了缓存命中时不会产生日志

线程安全:

使用 ConcurrentHashMap 保证缓存操作的线程安全

扩展性:

可以轻松添加其他装饰器(如性能监控、权限检查等)

透明性:

客户端代码不需要知道具体实现细节

这种设计模式非常适合需要动态添加功能的场景,同时保持了代码的整洁和可维护性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】YOLOv8在单目下视多车目标检测中的应用

Application of YOLOv8 in monocular downward multiple Car Target detection​​​​​ 原文真离谱&#xff0c;文章都不全还发上来 引言 自动驾驶技术是21世纪最重要的技术发展之一&#xff0c;有望彻底改变交通安全和效率。任何自动驾驶系统的核心都依赖于通过精确物体检…

在uni-app中如何从Options API迁移到Composition API?

uni-app 从 Options API 迁移到 Composition API 的详细指南 一、迁移前的准备 升级环境&#xff1a; 确保 HBuilderX 版本 ≥ 3.2.0项目 uni-app 版本 ≥ 3.0.0 了解 Composition API 基础&#xff1a; 响应式系统&#xff1a;ref、reactive生命周期钩子&#xff1a;onMount…

408第一季 - 数据结构 - 图

图的概念 完全图 无向图的完全图可以这么想&#xff1a;如果有4个点&#xff0c;每个点都会连向3个点&#xff0c;每个点也都会有来回的边&#xff0c;所以除以2 有向图就不用除以2 连通分量 不多解释 极大连通子图的意思就是让你把所有连起来的都圈出来 强连通图和强连通…

31.2linux中Regmap的API驱动icm20608实验(编程)_csdn

regmap 框架就讲解就是上一个文章&#xff0c;接下来学习编写的 icm20608 驱动改为 regmap 框架。 icm20608 驱动我们在之前的文章就已经编写了&#xff01; 因为之前已经对icm20608的设备树进行了修改&#xff0c;所以大家可以看到之前的文章&#xff01;当然这里我们还是带领…

Vue速查手册

Vue速查手册 CSS deep用法 使用父class进行限定&#xff0c;控制影响范围&#xff1a; <template><el-input class"my-input" /> </template><style scoped> /* Vue 3 推荐写法 */ .my-input :deep(.el-input__inner) {background-color…

振动力学:无阻尼多自由度系统(受迫振动)

本文从频域分析和时域分析揭示系统的运动特性&#xff0c;并给出系统在一般形式激励下的响应。主要讨论如下问题&#xff1a;频域分析、频响函数矩阵、反共振、振型叠加法等。 根据文章1中的式(1.7)&#xff0c;可知无阻尼受迫振动的初值问题为&#xff1a; M u ( t ) K u …

真实案例分享,Augment Code和Cursor那个比较好用?

你有没有遇到过这种情况&#xff1f;明明知道自己想要什么&#xff0c;写出来的提示词却让AI完全理解错了。 让AI翻译一篇文章&#xff0c;结果生成的中文不伦不类&#xff0c;机器僵硬&#xff0c;词汇不同&#xff0c;鸡同鸭讲。中国人看不懂&#xff0c;美国人表示耸肩。就…

zotero及其插件安装

zotero官网&#xff1a;Zotero | Your personal research assistant zotero中文社区&#xff1a;快速开始 | Zotero 中文社区 插件下载镜像地址&#xff1a;Zotero 插件商店 | Zotero 中文社区 翻译&#xff1a;Translate for Zotero 接入腾讯翻译API&#xff1a;总览 - 控制…

【SSM】SpringMVC学习笔记8:拦截器

这篇学习笔记是Spring系列笔记的第8篇&#xff0c;该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记&#xff0c;供自己和他人参考。 Spring学习笔记目录 笔记1&#xff1a;【SSM】Spring基础&#xff1a; IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。 笔记2…

从认识AI开始-----变分自编码器:从AE到VAE

前言 之前的文章里&#xff0c;我已经介绍了传统的AE能够将高维输入压缩成低维表示&#xff0c;并重建出来&#xff0c;但是它的隐空间结构并没有概率意义&#xff0c;这就导致了传统的AE无法自行生成新的数据&#xff08;比如新图像&#xff09;。因此&#xff0c;我们希望&a…

智慧赋能:移动充电桩的能源供给革命与便捷服务升级

在城市化进程加速与新能源汽车普及的双重推动下&#xff0c;移动充电桩正成为能源供给领域的一场革命。传统固定充电设施受限于布局与效率&#xff0c;难以满足用户即时、灵活的充电需求&#xff0c;而移动充电桩通过技术创新与服务升级&#xff0c;打破了时空壁垒&#xff0c;…

发版前后的调试对照实践:用 WebDebugX 与多工具构建上线验证闭环

每次产品发版都是一次“高压时刻”。版本升级带来的不仅是新功能上线&#xff0c;更常伴随隐藏 bug、兼容性差异与环境同步问题。 为了降低上线风险&#xff0c;我们逐步构建了一套以 WebDebugX 为核心、辅以 Charles、Postman、ADB、Sentry 的发版调试与验证流程&#xff0c;…

如何安装huaweicloud-sdk-core-3.1.142.jar到本地仓库?

如何安装huaweicloud-sdk-core-3.1.142.jar到本地仓库&#xff1f; package com.huaweicloud.sdk.core.auth does not exist 解决方案 # 下载huaweicloud-sdk-core-3.1.142.jar wget https://repo1.maven.org/maven2/com/huaweicloud/sdk/huaweicloud-sdk-core/3.1.142/huawe…

Python学习(7) ----- Python起源

&#x1f40d;《Python 的诞生》&#xff1a;一段圣诞假期的奇妙冒险 &#x1f4cd;时间&#xff1a;1989 年圣诞节 在荷兰阿姆斯特丹的一个寒冷冬夜&#xff0c;灯光昏黄、窗外飘着雪。一个程序员 Guido van Rossum 正窝在家里度假——没有会议、没有项目、没有 bug&#xf…

DiMTAIC 2024 数字医学技术及应用创新大赛-甲状腺B超静态及动态影像算法赛-参赛项目

参赛成绩 项目介绍 去年参加完这个比赛之后&#xff0c;整理了项目文件和代码&#xff0c;虽然比赛没有获奖&#xff0c;但是参赛过程中自己也很有收获&#xff0c;自己一个人搭建了完整的pipeline并基于此提交了多次提高成绩&#xff0c;现在把这个项目梳理成博客&#xff0c…

绘制饼图详细过程

QtCharts绘制饼图 说明&#xff1a;qcustomplot模块没有绘制饼图的接口和模块&#xff0c;所以用Qt官方自带的QtCharts进行绘制。绘制出来还挺美观。 1 模块导入 QT chartsQT_BEGIN_NAMESPACE以上这两行代码必须得加 2 总体代码 widget.h #ifndef WIDGET_H #defin…

本地windows主机安装seafile部署详解,及无公网IP内网映射外网访问方案

在Windows上部署Seafile服务器是一个相对直接的过程&#xff0c;但需要你具备一定的系统管理知识。Seafile是一个开源的文件共享和协作平台&#xff0c;类似于Dropbox或Google Drive。 以下是在Windows上部署Seafile服务器的步骤&#xff1a; 1. 准备环境 确保你的Windows系…

Vue学习之---nextTick

前言&#xff1a;目前来说&#xff0c;nextTick我们遇到的比较少&#xff0c;至少对我来说是这样的&#xff0c;但是有一些聪明的小朋友早早就注意到这个知识点了。nextTick 是前端开发&#xff08;尤其是 Vue 生态&#xff09;中的核心知识点&#xff0c;原理上跟Vue的异步更新…

MS2691 全频段、多模导航、射频低噪声放大器芯片,应用于导航仪 双频测量仪

MS2691 全频段、多模导航、射频低噪声放大器芯片&#xff0c;应用于导航仪 双频测量仪 产品简述 MS2691 是一款具有 1164MHz  1615MHz 全频段、低功耗的低噪声放大器芯片。该芯片通过对外围电路的简单配置&#xff0c;使得频带具有宽带或窄带特性。支持不同频段的各种导…

学习STC51单片机30(芯片为STC89C52RCRC)

每日一言 当你感到疲惫时&#xff0c;正是成长的关键时刻&#xff0c;再坚持一下。 IIC协议 是的&#xff0c;IIC协议就是与我们之前的串口通信协议是同一个性质&#xff0c;就是为了满足模块的通信&#xff0c;其实之前的串口通信协议叫做UART协议&#xff0c;我们千万不要弄…