自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 开闭原则详解:对扩展开放,对修改关闭(含图形编辑器反例 + 抽象正例 + JDK/Spring 实战)

开闭原则(OCP)要求软件实体对扩展开放、对修改关闭,通过面向接口编程实现“加功能不改老代码”。其核心是用抽象构建框架,以多态实现灵活扩展。反例中若用if-else判断类型,新增图形需修改旧类,违反OCP;正例则通过接口与实现分离,新增三角形只需添加新类,编辑器零改动。真实框架如JDK、Spring均依赖此原则实现热插拔式扩展。遵循OCP可提升系统稳定性、可维护性与可测试性,避免“改一处崩一片”的风险。

2026-10-17 22:19:24 235

原创 迪米特法则详解:只与直接朋友通信,少跟陌生人说话(含集团员工反例 + 修正正例 + 框架案例)

迪米特法则(最少知道原则)强调对象应仅与直接朋友通信,降低耦合度。核心是:只依赖必要类,不访问非直接朋友的内部。反例中总公司直接操作分公司员工,造成不必要的依赖;正例则将打印职责下沉至分公司,通过直接朋友调用实现解耦。合理运用可提升代码可维护性,但需避免过度引入中介导致复杂度上升。

2026-10-17 22:18:18 145

原创 原码、反码、补码:一张图讲透计算机里的负数表示

补码的诞生源于8位二进制需在256个状态内表示-128至127的整数范围。其核心价值在于:统一加减运算,使计算机仅用加法器即可完成所有算术操作。相比原码(异号相加错误)、反码(存在负零),补码通过“反码+1”规则实现模2⁸运算,加法后丢弃进位即得正确结果,且零唯一、范围对称。数学本质为[x]_补 = x + 2ⁿ,确保[x+y]_补 ≡ [x]_补 + [y]_补 (mod 2ⁿ),从而让硬件设计简洁高效。

2026-10-14 10:00:23 235

原创 接口隔离原则详解:建立最小接口,别逼实现类填空方法(含臃肿接口反例 + 拆分正例 + JDK 案例)

接口隔离原则(ISP)强调“客户端不应依赖它不需要的接口”,核心是拆分臃肿接口为多个小而专的接口,实现类只需实现真正需要的方法,避免空方法体。通过将大接口拆分为I1、I2、I3等窄接口,降低耦合、提升灵活性与可维护性。其本质是“为调用方定制服务”,与单一职责原则(SRP)互补:前者关注接口边界,后者聚焦类职责。实践中应适度细化,结合适配器模式或default方法应对遗留接口,但根本仍在于设计初期就遵循“最小接口”原则。

2026-10-14 09:45:20 174

原创 依赖倒置原则详解:面向接口编程,依赖抽象而非细节(含 Mother 读书反例 + 三种注入方式 + Spring 实战)

依赖倒置原则(DIP)要求高层模块依赖抽象而非具体实现,实现“面向接口编程”。通过引入接口(如IReader),使类A不再直接依赖类B,而是依赖其抽象,从而降低耦合。当需求变化时(如从读书改为读报),只需新增实现类,无需修改高层逻辑。该原则在Spring、JDBC、Servlet等框架中广泛应用,提升了代码可维护性与扩展性。

2026-10-13 09:31:16 145

原创 里氏替换原则详解:子类必须能透明替换基类(含继承风险演示 + 正确重构 + JDK 案例)

里氏替换原则(LSP)强调子类可替换父类且不改变程序行为,是继承复用与开闭原则的基石。核心在于:子类不能改变父类非抽象方法的契约,应通过组合而非继承实现复用。违反LSP会导致运行时逻辑错乱,如“减法”被误写为“加法”。正确做法是优先使用组合,仅在语义上满足“is-a”且不破坏契约时才用继承。JDK中Stack extends Vector等反例也警示我们:为复用而继承可能违背LSP。遵循LSP可提升系统稳定性、可维护性与扩展性。

2026-10-13 09:21:17 141

原创 单一职责原则(SRP)全解:降低耦合、提高复用,附可运行代码 + 面试辨析

单一职责原则(SRP)指出:一个类应只有一个引起变更的原因,即只承担一项职责。若类同时处理多个职责,会导致耦合、脆弱性、复用性差和可读性下降。通过将“呼吸空气”与“呼吸水”拆分为独立类,实现职责分离,提升可维护性与复用性。虽方法级别可部分分离,但类级单一更佳。该原则在分层架构、JDK 接口设计中广泛应用,是实现高内聚、低耦合的基础,也是开闭原则的前提。判断标准:若类因多种需求变化而改,即需拆分。

2026-10-12 09:39:04 277

原创 中介者模式详解:用“星型“结构解耦对象间的网状依赖

中介者模式通过引入中介对象,将多对象间的网状耦合转化为星型结构,实现松散耦合。其核心是让同事类仅与中介者交互,所有通信逻辑集中于中介者,便于维护与扩展。典型应用如婚介配对、聊天室系统,有效解决对象间直接引用导致的修改成本高、职责混乱等问题,符合开闭原则,提升代码可维护性。

2026-10-12 09:30:03 956

原创 解释器模式详解:为简单文法定义一套解释器

解释器模式用于为特定语言定义文法并构建可执行的解释器,将规则抽象为表达式类,实现文法与执行分离。通过上下文(Context)传递状态,终结符(如常量)直接解释,非终结符(如运算符)递归处理子表达式,支持规则组合与扩展。典型应用包括配置表达式求值、折扣规则解析及计算器等,避免复杂if/else逻辑,提升可维护性与可扩展性。

2026-10-11 21:23:57 205

原创 迭代器模式详解:统一遍历接口,解耦集合与访问(含可运行代码 + JDK Iterable 实战 + 面试辨析)

迭代器模式封装遍历逻辑,使客户端无需了解容器内部结构即可顺序访问元素。它通过分离遍历职责与容器实现,实现统一接口、解耦调用者,并支持多种遍历方式。核心在于将游标和遍历状态置于独立的迭代器对象中,确保多个遍历互不干扰。结合Java的Iterable与Iterator,可无缝支持for-each循环,且通过remove()方法实现安全删除,配合fail-fast机制保障并发修改时的可靠性。

2026-10-11 20:22:09 313

原创 命令模式详解:把“请求“封装成对象,支持撤销、队列与宏命令(含可运行代码 + Runnable 实战 + 撤销/重做)

命令模式将请求封装为可传递、可排队、可撤销的对象,实现调用者与接收者的解耦。通过Command接口抽象操作,ConcreteCommand绑定接收者,Invoker统一执行并支持撤销(undo)与历史记录。典型应用如点餐系统:顾客提交订单(命令),服务员(调用者)按单执行,无需知晓厨师(接收者)细节,且可退单、组合订单,提升灵活性与可维护性。

2026-10-10 10:48:08 419

原创 备忘录模式详解:不破坏封装地保存与恢复对象状态(含可运行代码 + 窄接口封装 + 撤销实战)

备忘录模式在不破坏封装的前提下,保存对象内部状态并支持回滚。通过原发器(Originator)创建备忘录(Memento),由管理者(Caretaker)持有但不可读取其内容,实现状态的可靠存储与恢复。关键在于将备忘录设为原发器的私有内部类,并对外提供窄接口,确保外部无法访问内部状态,真正实现封装性与开闭原则。

2026-10-10 10:37:34 254

原创 观察者模式详解:对象状态变了,关联对象自动同步(含可运行代码 + 推/拉模型 + Spring 实战)

观察者模式定义一对多依赖关系,当被观察者状态改变时,所有观察者自动收到通知并刷新。它通过统一的update回调实现解耦,避免硬编码通知逻辑,解决紧耦合与开闭原则问题。典型应用如MVC架构中Model变化触发View更新。代码实现分为推模型(直接传数据)和拉模型(观察者自行获取),各有优劣。推模型简单高效,拉模型更灵活,适用于不同场景。

2026-10-09 16:29:45 273

原创 状态模式详解:让对象随内部状态自动改变行为

状态模式通过将对象的行为与状态分离,使对象在状态变化时自动改变行为。它将状态逻辑封装为独立类,避免臃肿的if-else判断,实现开闭原则,提升可维护性。典型应用如订单状态机,状态由事件驱动转移,行为由当前状态决定,客户端无需感知状态切换过程。

2026-10-09 16:21:08 226

原创 策略模式详解:封装算法族,让算法可自由切换(含可运行代码 + 与状态/模板方法辨析)

策略模式将可互换的算法封装为独立类,通过Context统一管理并委托执行,实现算法与使用代码解耦。其核心是“运行时平滑切换”,避免if-else分支,符合开闭原则。典型应用如Comparator、线程池拒绝策略等。优点在于灵活扩展、消除条件判断;缺点是客户端需了解策略差异,策略类可能膨胀。适用于多算法场景,本质是“组合替代继承”。

2026-10-08 00:03:54 168

原创 模板方法模式详解:父类定骨架、子类填细节(含可运行代码 + 钩子方法 + 与策略辨析)

模板方法模式定义算法骨架,将步骤延迟至子类实现,确保流程不变而细节可变。父类用final锁定顺序,子类仅实现抽象方法或重写钩子,遵循“好莱坞原则”——反向调用。适用于流程一致但细节不同的场景,如车辆组装、Servlet处理、JDBC操作等。优点是代码复用与流程安全,缺点是继承耦合与扩展受限。与策略模式区别在于:模板方法固定流程(继承),策略模式可动态切换算法(组合)。

2026-10-07 23:32:00 261

原创 访问者模式详解:分离数据和行为,不改原有类就能加新操作

访问者模式允许在不修改元素类的前提下,定义作用于这些元素的新操作。适用于元素结构稳定但操作频繁变化的场景。通过将操作抽象为Visitor接口,新功能只需新增Visitor实现类,符合开闭原则。核心是双分派机制:元素通过accept方法将自身传递给访问者,由访问者根据具体类型执行相应操作。典型应用如遍历树形结构、数据处理等,能有效解耦数据与行为。

2026-10-07 23:26:34 153

原创 职责链模式详解:让请求在链上流动,谁该处理谁处理(含可运行代码 + 纯/不纯辨析)

职责链模式通过将多个处理者串联成链,实现请求的动态传递与处理,核心是解耦发送者与处理者,提升系统灵活性。它支持开闭原则,适用于审批流、Filter链、日志拦截等场景。分为纯职责链(处理即终止)与不纯职责链(全节点执行),常见于Servlet Filter、OKHttp Interceptor等框架中。优点在于可扩展性强,缺点是调试困难、可能漏处理,需合理设计链结构与兜底机制。

2026-10-06 10:00:44 261

原创 享元模式详解:共享对象,把内存占用打到最低

享元模式通过共享细粒度对象的内部状态,减少内存占用,适用于大量相似对象的场景。其核心是区分可共享的内部状态与随场景变化的外部状态,由客户端传入。典型应用如JDK中的字符串常量池、Integer缓存等,均实现对象复用。相比单例,享元支持按键值分组共享,更具灵活性。在文本编辑器、图形系统等需高效管理海量对象的场景中极具价值。

2026-10-06 09:21:41 429

原创 外观模式详解:给复杂子系统一个统一入口

外观模式为复杂子系统提供统一的简单接口,封装多步调用与执行顺序,降低客户端耦合,提升可维护性。它不新增功能,仅简化访问入口,适用于数据库、第三方SDK等场景。典型应用如SLF4J日志门面、Spring JdbcTemplate。核心思想是“隐藏复杂,只给一个按钮”,符合迪米特法则,但需避免门面过度臃肿。

2026-10-05 09:33:25 314

原创 装饰模式详解:不靠继承也能动态扩展对象功能(含可运行代码 + 与继承/适配器辨析)

装饰模式通过组合而非继承,动态为对象添加功能,避免类爆炸。它将核心功能与附加功能分离,用“装饰器”层层包装,实现灵活、可复用的扩展。相比继承,更符合开闭原则,支持运行时动态组合,广泛应用于I/O流、GUI组件、请求处理等场景。虽可能产生大量小类且调试复杂,但其透明性与灵活性使其成为功能扩展的理想选择。

2026-10-05 09:28:57 1353

原创 桥接模式详解:把抽象与实现解耦

桥接模式通过组合将抽象与实现分离,使两个独立变化的维度(如车型与引擎)可各自扩展而不产生类爆炸。其核心是用接口和组合替代继承,避免M×N类的膨胀问题,提升系统灵活性与可维护性。适用于多维度独立演化场景,区别于适配器(事后兼容)与策略(算法切换),本质是“事前拆解变化维度”。

2026-10-04 10:48:30 193

原创 适配器模式详解:让不兼容的接口协同工作

适配器模式通过引入适配器,将不兼容的接口转换为客户端所需的形式,实现不修改源码复用第三方或旧组件。其核心是定义目标接口,由适配器(推荐使用组合方式)封装被适配者,实现接口转换。该模式解耦系统、符合开闭原则,广泛应用于框架与库中(如JDK的流转换)。优先使用对象适配器,避免继承限制,提升灵活性。

2026-10-04 10:44:02 298

原创 代理模式详解:控制对象访问的利器(静态代理 + JDK 动态代理)

Proxy 模式是一种结构型模式。它为目标对象提供一个代理对象,由代理对象控制对目标对象的访问。代理与目标实现相同的接口,客户端只与代理打交道;代理在调用目标前后可执行额外操作,而不是单纯把请求转发出去。一句话:想给某个对象加"前置/后置处理"(鉴权、日志、缓存、事务),又不想改它的业务代码,就套一层代理。代理模式 = 给目标对象套一层同接口的代理,由代理控制访问、在调用前后织入增强,属于结构型模式。三角色:抽象主题Subject、真实主题、代理Proxy。静态代理简单直观但类易膨胀;

2026-10-02 11:20:26 331

原创 组合模式详解:用递归统一处理树形结构(含可运行代码 + 透明式/安全式对比)

组合模式通过统一接口让叶子与容器对象一致处理,实现树形结构的递归遍历。透明式下所有节点共用接口,客户端无需类型判断,但叶子存在无效操作;安全式则仅容器提供增删方法,避免误调用,但需类型检查。二者权衡在于“统一性”与“安全性”。

2026-10-02 11:11:46 266

原创 建造者模式详解:分步构建复杂对象

建造者模式用于封装复杂对象的创建过程,尤其适用于多参数、部分可选的复合对象。它通过分离构建步骤与对象组装,避免重叠构造器和JavaBean模式带来的顺序混乱与状态不一致问题。经典结构包含产品、抽象/具体建造者、指挥者与客户端,确保对象在build()后才完整且不可变。现代实践中常省略指挥者,采用链式调用实现高可读性与线程安全,广泛应用于OkHttp、Gson等框架,是处理复杂对象创建的优雅方案。

2026-09-30 10:28:51 210

原创 原型模式详解:克隆对象与浅克隆/深克隆

原型模式通过clone()方法复制对象,实现与原型相同结构和值的新实例。核心在于由原型自身创建对象,而非外部new。默认super.clone()为浅克隆,共享可变引用,易引发副作用;深克隆需手动克隆引用对象或使用序列化,确保副本独立。适用于高成本创建、需保持原型数据或隐藏创建细节的场景。关键点:有可变引用时必须深克隆,否则修改将影响原对象。

2026-09-30 10:02:59 325

原创 抽象工厂模式详解:产品族 × 产品等级

抽象工厂模式通过定义产品族与产品等级结构,实现对一组相关产品的统一创建。客户端仅依赖抽象接口,与具体类解耦,确保同一工厂产出一致风格的产品,避免混搭。其核心是“面向产品族编程”,适合产品成族变化的场景,虽新增产品种类需修改接口(纵向扩展难),但新增产品族极为便捷,符合开闭原则。相较工厂方法模式,它更适用于多产品等级协同创建的复杂场景。

2026-09-29 09:53:46 719

原创 工厂方法模式详解:创建型模式核心套路

工厂方法模式是一种创建型设计模式,通过定义抽象工厂接口,将产品创建延迟到子类实现,实现开闭原则。其核心角色包括抽象工厂、具体工厂、抽象产品与具体产品。新增产品只需扩展对应工厂类,无需修改原有代码,易于维护与扩展。相比简单工厂(集中创建逻辑,违反开闭原则),工厂方法虽类数增多,但结构更清晰、耦合更低。适用于产品持续扩展的场景,遵循“一个产品配一个工厂”的设计思想。

2026-09-29 09:29:37 219

原创 单例模式详解:5 种写法全对比 + 双重检查 volatile 原理 + 枚举最佳实践

单例模式确保类在程序生命周期内仅有一个实例,通过私有构造器、内部持有实例及全局访问方法实现。适用于配置管理、连接池等需全局唯一资源的场景。常见实现包括饿汉式(简单但不懒加载)、懒汉式(线程安全但性能差)、双重检查锁(高效需volatile)、静态内部类(推荐)及枚举(最佳,天然防反射、反序列化)。需注意防御反射、反序列化和克隆攻击,建议优先使用枚举或静态内部类。

2026-09-28 22:46:42 557

原创 分布式事务实战:基于 XA 协议的 2PC 原理与 Atomikos 落地

本文解析分布式事务的必要性,指出单体事务无法解决跨库、跨服务一致性问题。基于JTA与XA协议,详解两阶段提交(2PC)原理及优缺点,并通过Spring Boot + Atomikos实现“下单扣库存”的跨库事务实战,验证全局提交或回滚机制,展示JTA在分布式场景下的工程落地路径。

2026-09-28 16:21:42 320

原创 Nginx 高可用:Keepalived 主备切换详解

本文详细介绍了Keepalived的源码安装与主备节点配置流程。通过下载keepalived-2.3.4.tar.gz,编译安装并注册为系统服务,配置主节点(MASTER)和备节点(BACKUP)的VRRP实例,设置优先级、认证密码及虚拟IP。结合Nginx健康检测脚本实现故障自动切换,并启用开机自启。主备节点配置需保持一致,仅状态与优先级不同,确保高可用性。

2026-09-24 15:15:45 404

原创 MinIO CVE-2023-28432:平滑升级与 mc 迁移指南

CVE-2023-28432为MinIO集群模式下的信息泄露漏洞,攻击者可未授权访问敏感数据。受影响版本需升级至RELEASE.2022-10-29T06-21-33Z以上。由于旧版升级可能导致无法启动,建议部署新版本MinIO并使用mc工具迁移数据。通过配置alias并执行mc mirror完成全量迁移,最后替换启动脚本,恢复原端口与配置,并设置bucket为public以保障服务可用性。

2024-01-16 15:14:51 1659

原创 Maven 版本号:SNAPSHOT 与 Release 一文搞懂

Maven中,SNAPSHOT版用于开发阶段,依赖优先从远程仓库更新,确保团队成员获取最新代码;而Releases版为正式发布版本,仅在本地无依赖时从远程下载,后续使用本地缓存,可能导致版本滞后。版本号遵循主.次.增-里程碑格式,分别代表架构变更、功能迭代、修复及里程碑状态。快照版支持动态更新机制,保障开发协同效率。

2021-12-24 16:09:36 1162

原创 SQL 位运算实战:用 & 一个字段搞定多条件匹配

饲养员携带苹果、树叶,可投喂鹿、猴子、熊猫、兔子。通过位运算,将食物映射为二进制位(苹果=1、竹子=2、树叶=4),动物允许食物对应位为1。查询时用 food & 5 > 0 筛选同时满足吃苹果或树叶的动物。新增食物只需前移一位,删除则需重建数据,修改同理。该方法高效且扩展性强。

2020-07-18 17:04:22 4245

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除