- 博客(411)
- 资源 (10)
- 收藏
- 关注
原创 深入剖析与解决:`DELETE net::ERR_CONNECTION_RESET` 错误全指南
当您在 Web 开发或日常浏览中,尝试通过 HTTP `DELETE` 方法删除某个资源时,突然弹出的 `net::ERR_CONNECTION_RESET` 错误无疑会让人感到沮丧。这个错误通常出现在 Chrome 或基于 Chromium 内核的浏览器中,它告诉我们一个残酷的事实:客户端(浏览器)与服务器之间的 TCP 连接在请求完成之前被意外地重置了。
2025-05-16 10:44:14
43
原创 JSP 实现二级联动下拉菜单:一次加载,前端动态更新
本文介绍了在JSP中实现二级联动下拉菜单的方法,通过后端一次性加载所有数据到前端,利用JavaScript动态更新二级菜单,避免频繁的AJAX请求。核心步骤包括:1) 后端准备数据并转换为JSON格式;2) 前端JSP页面渲染一级菜单,并通过JavaScript处理联动逻辑。技术栈涉及Java Servlet、JSTL、JavaScript和Gson库。该方法适用于数据量不大的场景,能够有效提升用户体验和系统性能。
2025-05-16 10:42:00
39
原创 NGINX 安全性:持续进化的防护能力,为您的应用保驾护航
在数字时代,网络安全的重要性不言而喻。任何暴露在互联网上的应用都可能成为攻击者的目标。作为互联网基础设施的关键组成部分,NGINX 不仅是高性能的 Web 服务器和反向代理,更在应用安全防护方面扮演着至关重要的角色。它就像您数字资产的“第一道防线”和“智能门禁”,凭借其丰富的功能和持续的进化,为您的应用提供日益强大的安全保障。
2025-05-15 10:49:37
32
原创 NGINX 开源与社区动态:从基石到浪潮,持续演进的生态力量
NGINX 之所以能够成为全球应用最为广泛的 Web 服务器和反向代理软件之一,其成功的核心驱动力无疑是开源。开放的源代码、活跃的社区参与以及透明的开发过程,共同铸就了 NGINX 的辉煌。然而,正如所有大型开源项目一样,NGINX 的开源之路也并非一帆风顺,其社区动态也时常涌现新的变化与讨论。本文将带您回顾 NGINX 的开源基因,探讨其社区生态的演进,并关注近期值得注意的动态。
2025-05-15 10:46:59
146
原创 Nginx+Lua 实战避坑:从模块加载失败到版本冲突的深度剖析
Nginx 集成 Lua(通过 ngx_http_lua_module 或 OpenResty)为 Web 服务器提供了动态逻辑处理能力,但配置和使用中常遇到模块加载失败、版本冲突、客户端 IP 获取不准等问题。本文分析了这些常见问题,并提供了解决方案和最佳实践。 模块加载失败:通常由于模块未安装或路径配置不当。建议使用 OpenResty 或手动安装模块并正确配置 lua_package_path 和 lua_package_cpath。 版本冲突:不同版本的 Nginx、LuaJIT 和 lua-res
2025-05-14 10:16:55
284
原创 揭秘DNS中的“万能便签”:TXT记录的配置与妙用
你是否曾在配置网站服务、设置企业邮箱,或申请SSL证书时,被要求添加一条奇奇怪怪的“TXT记录”?这条看似不起眼的记录,在域名解析的世界里却扮演着至关重要的角色。今天,我们就来深入浅出地聊聊DNS中的TXT记录,看看它究竟是什么,如何配置,以及它有哪些“神仙”般的用途。
2025-05-14 10:07:09
36
原创 Spring MessageSource 详解:如何在国际化消息中传递参数
Spring 的 MessageSource 是处理多语言应用程序国际化的核心组件,允许根据用户的 Locale 显示不同消息。当消息需要包含动态数据(如用户名、数量等)时,可以通过占位符 {index} 在消息属性文件中定义动态内容,并在 Java 代码中使用 MessageSource 的 getMessage() 方法传递参数。MessageFormat 类负责处理占位符与参数的匹配。在视图层(如 Thymeleaf 或 JSP)中,可以进一步简化消息的获取与展示。通过合理使用 MessageSour
2025-05-13 10:45:50
158
原创 PDF.js 中的 .mjs 文件能随便改成 .js 吗?别急,先了解一下!
mjs文件扩展名在现代 JavaScript 中有其特定的含义,用于标识 ESM 模块。PDF.js 使用.mjs是为了利用 ESM 的优势。直接将 PDF.js 中的.mjs文件简单地重命名为.js是不安全的,会破坏模块加载机制、内部依赖关系并绕过必要的构建步骤,导致库无法正常工作。始终建议使用 PDF.js 的官方构建版本,或者在理解其构建流程的基础上对源代码进行修改和重新构建。理解.mjs和 ESM 是更好地使用和探索现代 JavaScript 库的关键一步!
2025-05-08 17:10:35
560
原创 使用 CDN 在国内加载本地 PDF 文件并处理批注:PDF.js 5.x 实战指南
本文详细介绍了如何在中国大陆地区选择合适的 CDN(如 jsDelivr 或 BootCDN),通过 CDN 引入 PDF.js 5.x 版本,并使用 JavaScript 加载用户选择的本地 PDF 文件并将其渲染到网页的 Canvas 元素上。同时,我们澄清了 PDF.js 在批注功能方面的能力:它能很好地显示PDF 中已有的批注,但不包含创建和编辑批注的内置工具。如果你需要完整的交互式批注功能,需要进行额外的开发或考虑使用更专业的第三方库。
2025-05-08 17:08:37
1157
原创 在现代Web应用中集成 PDF.js (pdfjs-dist 5.2 ESM): 通过 jsdelivr 实现动态加载与批注功能的思考
pdfjs-dist库的主要功能是渲染PDF 内容,包括显示PDF 文件中已有的批注。它不提供添加、编辑或保存新的批注的功能。实现批注(如高亮、下划线、矩形框、文本框等)是一个需要在 PDF 渲染层之上自定义构建的功能。实现自定义批注功能的整体思路是在每个 PDF 页面渲染出的canvas上方,叠加一个透明的 HTML 元素(我们在第二步中创建了),然后在这个叠加层上通过 DOM 操作、SVG 绘制或额外的 Canvas 绘制来表示批注。确保每个 PDF 页面都有一个精确覆盖其渲染区域的批注层 (
2025-05-08 17:07:58
989
原创 为什么引入其他网站的 .mjs 会触发 CORS 错误,而 .js 不会?—— ES Modules 与 CORS 的爱恨情仇
mjs文件触发 CORS 错误而.js不会,根本原因在于浏览器对 ES Modules () 采取了更严格的跨域安全策略,而对传统的保留了宽松的历史行为。解决这个问题不能仅仅依靠前端代码,而是必须从服务器端着手,在提供.mjs文件的响应中正确设置头部。如果无法控制源服务器,考虑使用服务器端代理也是一个可行的方法。理解并正确配置 CORS 是进行现代 Web 开发不可或缺的一部分。希望这篇文章能帮助你理解并解决这个令人头疼的.mjs跨域问题!
2025-05-08 17:05:42
874
原创 解决 Tomcat 项目中 “Failed to load module script: Expected a JavaScript module script...“ MIME 类型错误
Failed to load module script…” MIME 类型错误的核心是服务器没有为.js文件返回正确的头部。对于Spring Boot + 内嵌 Tomcat,推荐通过实现来添加.js的 MIME 映射。对于传统 Spring + 外部 Tomcat,推荐在应用的中添加。如果在应用层面配置后问题依然存在,则需要系统地排查部署、缓存、中间层代理、Filter/Interceptor 等其他可能的干扰因素。通过利用浏览器开发者工具确认实际接收到的响应头,是定位问题的关键第一步。
2025-05-08 16:43:49
647
原创 Java Set<String>:如何高效判断是否包含指定字符串?
场景方法/实现方式效率 (HashSet)包含某个特定字符串平均 O(1)包含另一个集合中所有字符串平均 O(N) (N 是检查集合大小)包含另一个集合中任意一个字符串遍历检查集合,对每个元素调用平均 O(N) (N 是检查集合大小,最坏情况)包含另一个集合中任意一个字符串平均 O(N) (N 是检查集合大小,最坏情况)请根据你的具体需求,选择最适合的方法来判断是否包含指定的字符串。对于HashSet来说,contains()
2025-04-30 16:01:29
601
原创 C# 中重启程序通常意味着关闭当前运行的应用程序实例
在 C# 中重启程序通常意味着关闭当前运行的应用程序实例,然后立即启动一个新的实例。这个过程可以通过几种方式实现,具体取决于你的应用程序类型(控制台、WinForms、WPF 等)。
2025-04-29 10:29:40
897
原创 Windows 平台上的开源 SSH 工具精选指南
对于需要远程管理 Linux/Unix 服务器的 Windows 用户来说,一个好用、可靠的 SSH 客户端是必不可少的工具。过去,Windows 在这方面选择相对有限,或者需要依赖一些功能基础的第三方工具。但随着技术的发展,特别是 Windows 10/11 集成了 OpenSSH 和推出了 Windows Terminal,以及涌现出一些优秀的第三方开源客户端,Windows 上的 SSH 体验已经得到了显著提升。
2025-04-29 10:08:47
859
原创 MSTSC 远程桌面突然无法复制粘贴?别慌,手把手教你解决!
远程桌面无法复制粘贴是一个常见但令人沮丧的问题,其根源通常在于剪贴板重定向的中断。最常见的解决方案是:重启远程计算机上的进程。检查本地远程桌面客户端的“剪贴板”选项是否勾选。断开并重新连接远程桌面会话。如果这些简单方法无效,再考虑检查远程桌面服务状态、组策略设置或是否存在软件冲突。按顺序尝试这些方法,你多半能快速解决 MSTSC 远程桌面无法复制粘贴的困境,让你的远程操作再次流畅起来!
2025-04-29 08:45:00
884
原创 JODConverter 在 Spring Boot (Windows) 中遭遇 “Connection refused“?这篇排坑指南送给你!
遇到错误时,请保持冷静,并按照上述步骤系统地进行排查。配置错误。Office 进程未能成功启动。Office 用户配置文件损坏导致 Office 无法在无头模式下启动。端口被其他程序占用。排查问题的最佳实践:很多时候日志已经给出了答案。通过步骤 3 手动启动 Office,能够快速判断是 JODConverter 启动的问题还是 Office 本身的问题。步骤 4 的方法是解决 Office 用户配置损坏的有效手段,在 Windows 环境下尤其值得尝试。熟练使用netstat。
2025-04-28 17:05:00
820
原创 在 Windows 环境下测试 8100 端口是否开放和正在监听
这是 PowerShell 中一个更现代、功能更强大的网络测试工具(适用于 Windows 8/Server 2012 及更高版本)。是一个客户端工具,可以尝试连接到指定地址和端口。如果能成功连接,说明该端口是开放并有服务在监听的。默认情况下,较新的 Windows 版本没有安装 Telnet 客户端。是最直接且能提供进程信息的,适合用于排查是哪个程序占用了端口或者端口确实没有被监听。这是检查当前系统网络连接和监听端口的标准方法。则直接测试从你的机器到该端口的连接性。打开 PowerShell。
2025-04-28 16:37:10
610
原创 跨语言哈希一致性:C# 与 Java 的 MD5 之战?
C# 和 Java 中的 MD5 算法实现本身都是基于标准算法的,对于相同的字节序列,它们必定产生相同的哈希值。如果遇到不一致的情况,绝大多数原因在于对待哈希的原始数据(尤其是字符串)转换为字节序列时使用了不同的字符编码。通过显式指定并统一使用相同的字符编码(如 UTF-8)来处理字符串,并确保输入数据本身没有差异(如隐藏的空白符、不同的换行符),你就可以保证 C# 和 Java 之间 MD5 计算结果的一致性。掌握“MD5 哈希的是字节流”这一本质,是解决这类跨语言一致性问题的关键。
2025-04-28 14:35:13
1106
原创 告别手动修改!Advanced Installer 技巧:让安装包文件名自动带上版本号
发布软件新版本时,除了代码和功能更新,制作新的安装包也是必不可少的一环。为了方便用户区分和我们自己管理,通常会在生成的安装包文件名中包含当前的版本号,比如或。很多人可能会在 Advanced Installer 构建完成后,手动去文件输出目录修改文件名。这不仅效率低下,而且容易出错,特别是在自动化构建流程中,手动步骤更是不可接受。别担心!Advanced Installer 作为一款功能强大的安装包制作工具,早已为我们提供了自动化的解决方案——。
2025-04-28 14:32:11
527
原创 介绍如何在 Visual Studio 中安装和使用 Visual Studio Installer Projects 扩展来制作安装包
如果你需要在安装或卸载过程的特定时刻执行额外的操作(例如运行一个脚本、启动一个配置程序),可以在这里添加自定义操作。
2025-04-28 08:46:40
943
原创 告别手动复制粘贴!Windows 应用程序安装包制作工具哪家强?深度对比与选择指南
作为开发者,当我们辛辛苦苦完成一个 Windows 桌面应用程序后,下一步就是如何把它交给用户使用。总不能让用户手动去复制文件、设置注册表、创建快捷方式吧?这时候,我们就需要一个“安装包”,它能自动化完成这些繁琐的工作,让用户只需双击,点几下“下一步”,就能轻松把软件安装到电脑上。安装包制作工具,就是帮助我们完成这一使命的利器。市面上的工具五花八门,有免费的,有收费的;有靠写脚本的,也有纯图形化操作的。尤其是对于不习惯写脚本、更喜欢直观界面的朋友来说,“有没有图形化界面?”是选择工具时的重要考量。
2025-04-28 08:46:14
782
原创 在 C# .NET 中驾驭 JSON:使用 Newtonsoft.Json 进行解析与 POST 请求实战
是一个强大而灵活的库,为 C# 开发者提供了完整的 JSON 处理能力。无论是将复杂的 JSON 数据映射到强类型 C# 对象进行安全可靠的访问,还是使用JToken系列进行动态探索和操作未知结构的 JSON,它都能胜任。结合HttpClient发送类型的 POST 请求,是现代 C# 应用与 Web API 交互的基石。虽然 .NET Core 3.0 以后引入了内置的,它在某些场景下提供更好的性能,并且是微软官方在新的 .NET 版本中推荐的内置 JSON 库。然而,
2025-04-28 08:45:50
950
原创 Node.js 全栈工程师炼成之第12篇 - 质量保障:Node.js 测试驱动开发 (TDD) 与 Jest 实战
测试驱动开发 (TDD) 是一种颠覆传统开发流程(先写代码,后写测试)的方法。编写一个失败的测试用例。这个测试用例描述了你将要实现的功能或修复的 bug。因为代码还没写,测试自然会失败(变红)。编写最少量的代码,仅仅是为了让刚刚失败的测试用例通过(变绿)。此时不追求代码的完美,只求能工作。在测试保持通过(绿灯)的前提下,重构刚刚编写的代码以及相关的旧代码,消除重复,提高可读性,改进设计,使其更清晰、更健壮。TDD 的好处:测试用例定义了代码需要满足的需求。
2025-04-28 08:45:23
629
原创 用Java模拟打字:深入解析 java.awt.Robot 的键盘控制艺术
通过,我们可以实现强大的键盘自动化功能。对于简单的字符(英文字母、数字、基础标点等),可以通过模拟单个按键的按下和释放(可能需要配合 Shift 等修饰键)来实现,这需要建立字符到键码的映射并注意按键时序和延迟。对于复杂字符、中文或长文本,由于Robot不理解输入法逻辑,最可靠和常用的方法是将文本复制到系统剪贴板,然后模拟按下系统的粘贴快捷键。无论使用哪种方法,理解Robot的工作原理(模拟物理按键),处理好窗口焦点,并加入适当的延迟,是确保模拟输入成功的关键。虽然Robot。
2025-04-28 08:44:47
3303
原创 【Rust 精进之路之30篇 - 模块化】包、Crate 与模块系统:大型项目的组织结构
Rust 的模块系统(包、Crate、模块、路径、usepub)提供了一套强大而灵活的工具来组织代码、控制可见性和封装实现细节。Cargo 管理的基本单元,包含Cargo.toml和源代码。编译单元,可以是库 (lib.rs) 或二进制 (main.rsbin/*.rs模块 (mod在 Crate 内部组织代码,形成命名空间和层级结构,可放在单独文件。用于引用项,分绝对路径 (crate::...) 和相对路径 (可见性 (pub默认私有,使用pub使项对外部可见。结构体字段可见性需单独指定。
2025-04-27 12:31:08
36
1
原创 Node.js 全栈工程师炼成之第11篇 - 健壮性基石:Node.js 错误处理与日志记录最佳实践
发生在 Express 请求处理流程之外的异步操作错误(例如,一个独立的或setTimeout中的 Promise rejection 未被处理)。同步代码中未被包裹的错误,且发生在 Express 中间件或路由处理器调用栈之外。捕获未被处理的同步错误。捕获未被处理的。监听这两个事件是必要的,但目的不是让应用在捕获到这类错误后继续运行!因为当这些事件发生时,应用程序可能已经处于一个不一致或损坏的状态。强行让它继续运行可能导致更严重的数据问题或安全漏洞。
2025-04-27 12:30:59
34
原创 【Rust 精进之路之第29篇 - Trait·高级】关联类型 (Associated Types):Trait 内的类型占位符
在之前的章节中,我们学习了 Trait 如何定义一组共享的方法签名,让不同的类型可以实现这些行为。我们还看到了如何使用泛型<T>来让 Trait 或实现它的类型能够处理多种具体类型。然而,在某些 Trait 的设计中,仅仅定义方法可能还不够。有时,一个 Trait 的概念本身就内在地关联着一些其他的特定类型。例如,考虑标准库中的IteratorTrait,它定义了可以产生一系列值的类型的行为。一个迭代器不仅需要一个next()方法来获取下一个值,它还需要指定这个“下一个值”的具体类型是什么。
2025-04-27 12:30:50
23
原创 【Rust 精进之路之第28篇 - Trait·进阶】Trait 对象 (`dyn Trait`):动态分发的实现与权衡
Trait 对象是一种特殊的指针类型,它指向某个实现了特定 Trait 的类型的实例。它允许我们在运行时处理不同类型的值,只要这些值都实现了相同的 Trait。Trait 对象的类型写作(不可变 Trait 对象引用) 或(可变 Trait 对象引用),或者(拥有所有权的 Trait 对象,存储在堆上)。这里的dyn关键字(dynamic 的缩写)明确表示这是一个 Trait 对象,涉及到动态分发。示例:GUI 组件列表// 1. 定义一个 Drawable Trait。
2025-04-27 12:30:39
31
原创 Node.js 全栈工程师炼成之第10篇 - 结构化存储:Node.js 与 SQL 数据库 (Sequelize 篇)
Sequelize 模型是 JavaScript 类,它们代表数据库中的一张表。每个模型实例代表表中的一行数据。使用// 引入 DataTypes// 引入之前创建的 Sequelize 实例// 定义 User 模型,它将映射到数据库的 'users' 表 (Sequelize 会自动变复数)// 模型属性 (对应表的列)id: {type: DataTypes.INTEGER, // 数据类型autoIncrement: true, // 自动增长。
2025-04-27 12:30:29
34
原创 Node.js 全栈工程师炼成之第9篇 - 让数据“安家”:Node.js 与 MongoDB (Mongoose 篇)
连接成功后,我们需要定义数据的结构。定义集合 (Collection) 中文档 (Document) 的结构、字段类型、验证规则等。// models/User.js (示例文件)// 获取 Schema 构造函数// 创建用户 Schemaname: {type: String, // 数据类型required: true, // 是否必需trim: true // 自动移除前后空格},email: {unique: true, // 邮箱必须唯一。
2025-04-27 12:30:19
27
原创 Java 设计模式心法之第31篇 - 终章:修炼模式思维,迈向卓越架构师之路
在我们这段设计模式的探索之旅中,我们不仅学习了各种模式的“形”(结构与实现),更着重于领悟其“神”(意图、原则、权衡)。没有哪个设计模式是万能的。每个模式都有其最擅长解决的特定问题和适用场景。生搬硬套、为了用模式而用模式,是学习路上的最大误区。必须结合具体的业务需求、系统环境、团队能力等上下文来判断是否需要以及如何应用模式。死记硬背 UML 图和代码模板意义不大。真正重要的是深刻理解每个模式要解决什么核心问题),以及它为何能解决这个问题(Why does it work?抓住了模式的设计意图。
2025-04-27 12:30:03
488
原创 Java 设计模式心法之第30篇 - 返璞归真:设计模式与 SOLID 原则的深度融合
本章我们深入探讨了设计模式与 SOLID 原则之间密不可分的联系。我们看到,模式是原则在实践中的具体体现,而原则是理解、评判和指导模式应用的基石。更深刻地理解模式的价值和适用性。更有依据地进行模式选择和设计决策。在没有模式可循时,依然能做出良好的设计。最终将模式知识升华为一种内化的设计思维和能力。设计之路,返璞归真,终究是回归到那些简单而深刻的基本原则上。当原则真正融入你的设计血液,设计模式便不再是需要刻意记忆的条条框框,而是你手中应对软件复杂性挑战的、运用自如的利器。
2025-04-27 12:29:50
827
原创 Java 设计模式心法之第29篇 - 与时俱进:从 GoF 到现代企业级模式精要
GoF 23 种设计模式为我们提供了宝贵的、通用的面向对象设计智慧。然而,现代企业级 Java 开发的实践,在这些经典模式的基础上,发展出了如 IoC/DI、DAO、DTO、MVC 等一系列更贴近实战、更侧重于架构和特定领域问题的模式与理念。高效利用现代框架(如 Spring)构建清晰、可维护、可测试的企业级应用在更高的架构层面进行思考和设计都至关重要。
2025-04-27 12:28:49
970
原创 Java 设计模式心法之第28篇 - 歧路警示:常见模式误用与反模式 (Anti-Patterns) 辨析
误用表现:对于创建逻辑非常简单(仅仅是new一个对象)、几乎不可能变化的对象,也强行套用工厂方法或抽象工厂,增加了不必要的类和抽象层次。过度依赖简单工厂(一个包含if-else或switch的静态工厂方法),当产品类型增多时,工厂类变得臃肿且违反 OCP。危害:无谓的抽象和间接层。对于简单场景,直接new可能比通过工厂更清晰。何时应该警惕?如果对象的创建逻辑只是简单的,并且这个类不太可能被替换或有多种实现,直接new通常是最好的选择。如果只是需要根据简单条件创建少量几种对象,简单工厂。
2025-04-27 12:28:40
438
原创 Java 设计模式心法之第28篇 - 歧路警示:常见模式误用与反模式 (Anti-Patterns) 辨析
误用表现:对于创建逻辑非常简单(仅仅是new一个对象)、几乎不可能变化的对象,也强行套用工厂方法或抽象工厂,增加了不必要的类和抽象层次。过度依赖简单工厂(一个包含if-else或switch的静态工厂方法),当产品类型增多时,工厂类变得臃肿且违反 OCP。危害:无谓的抽象和间接层。对于简单场景,直接new可能比通过工厂更清晰。何时应该警惕?如果对象的创建逻辑只是简单的,并且这个类不太可能被替换或有多种实现,直接new通常是最好的选择。如果只是需要根据简单条件创建少量几种对象,简单工厂。
2025-04-27 12:28:32
798
原创 Java 设计模式心法之第27篇 - 实战演武:模式组合的威力 - 电商订单系统案例深度剖析
需要支持创建不同类型的订单(普通订单、预售订单),它们的创建逻辑或默认属性可能不同。解决方案:工厂方法模式 (Factory Method)定义一个接口或抽象类,包含方法。为每种订单类型创建具体的工厂子类,如,它们各自实现来创建对应类型的Order对象。持有对的引用(可以通过 DI 注入具体的工厂实例),并调用其方法。(如果涉及产品族,比如创建订单的同时还需要创建对应的发票类型、物流优先级等,则可以考虑抽象工厂模式)。解决一个真实的、复杂的业务问题,往往需要多种设计模式协同工作。
2025-04-27 12:28:23
621
原创 Java 设计模式心法之第26篇 - 解释器 (Interpreter) - 构建领域特定语言的解析引擎
解释器模式 (Interpreter Pattern)提供了一种解决方案。它为一种语言定义其文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。GoF 的经典意图描述是:“给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。其核心思想在于将语言的文法规则映射到类的层次结构定义一个接口或抽象类,声明一个(或evaluateexecute等)方法。所有代表语言文法元素的类都需要实现这个接口。这个方法通常需要一个上下文 (Context)
2025-04-27 12:28:13
773
原创 Java 设计模式心法之第25篇 - 中介者 (Mediator) - 用“中央协调”降低对象间耦合度
中介者模式 (Mediator Pattern)提供了一种解决方案。它用一个中介对象 (Mediator)来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。GoF 的经典意图描述是:“用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。其核心思想在于引入中介者定义一个接口或抽象类,让所有需要通过中介者进行通信的对象(称为同事 Colleague)都实现或继承它。
2025-04-27 12:28:02
595
原创 Java 设计模式心法之第24篇 - 访问者 (Visitor) - 在不修改结构的前提下增加新操作
访问者模式 (Visitor Pattern)提供了一种优雅的解决方案。它允许你定义一个新的操作,作用于一个对象结构中的各个元素,而无需改变这些元素的类。GoF 的经典意图描述是:“表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。其核心思想在于利用双重分派 (Double Dispatch)在每个具体元素类 (ConcreteElement)中增加一个方法。这个方法的实现非常简单,就是调用传入的visitor对象的相应visit()方法,并将。
2025-04-27 12:27:46
991
JavaFX实战:从零到一,构建你的第一个点击放置(Clicker/Idle)游戏完整代码
2025-04-22
JavaFX 实战:从零打造一个功能丰富的英文“刽子手”(Hangman)游戏 完整代码
2025-04-22
【Web服务器配置】精通Nginx配置:从基础架构到高级优化与扩展的全方位指南
2025-04-18
Docker Compose 高级应用模式大全:一文掌握36种跨领域服务编排模板与最佳实践
2025-04-18
Dockerfile实战进阶:从核心原理到20+场景的优化模式与安全策略
2025-04-18
文章总结:精通 ESLint & Prettier:构建专业级代码规范与自动化流程
2025-04-18
【Java应用性能优化】Logback与Log4j2日志配置深度解析:构建高效日志系统的核心技术与实践指南
2025-04-18
【Java构建工具优化】Maven & Gradle完全优化指南:告别缓慢构建,精通多环境部署
2025-04-18
【Docker Compose】高级编排实战指南:涵盖Web全栈、AI/ML、IoT、监控、CI/CD等多领域应用部署摘要 本文
2025-04-17
Nginx 配置深度解析:从高手到大师,掌握官方文档之外的 70+ 实战秘籍
2025-04-17
Dockerfile宝典:涵盖20+技术栈的高效容器化实践与模板
2025-04-17
Nginx 配置速查指南 (核心场景版)
2025-04-17
包含全国大学、高中、初中、技校、小学全部名称数据,含省/直辖市编码名称、地市编码及名称、区县编码及名称、学校编码及名称,近19.5万条最全数据,数据来源学 生 体 质健康网,年份2025年 若有问题
2025-02-26
全国初中高中小学学校名单2024版.xlsx
2024-05-31
国内邮政编码2023版-MySQL数据库脚本(postcode-detail.sql)
2023-02-04
全国初中高中小学学校名单2023版.xlsx
2023-02-03
MyEclipse中用git导出项目说明.doc
2022-12-02
Nginx下搭建flv视频服务器且支持视频拖动进度条播放.docx
2022-12-02
使用MyEclipse构建多模块Maven项目说明.doc
2022-12-02
SpringMVC使用JSR-303进行验证Bean.docx
2022-12-02
使用Nexus2搭建Maven私服配置说明.doc
2022-12-02
技术研发人员绩效考核及奖励制度.doc
2022-12-02
02129 信息资源建设《信息资源管理(第2版) 电子工业出版社 肖明著》-知识点思维导图.xmind
2022-09-05
全国初中高中小学学校名单2022版.xlsx
2022-04-06
国内邮政编码2021版-MySQL数据库脚本(postcode-detail.sql)
2021-06-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人