当前位置: 首页 > article >正文

软件设计原则详解:开闭原则、里氏替换原则、迪米特法则

软件设计三大核心原则开闭里氏替换依赖倒置全网最细讲解附Java正反例面试必背在日常开发中你一定遇到过这些痛点加个小功能改出一堆Bug继承乱用逻辑越跑越偏换个数据库/组件要改几十处代码这些问题本质都是没遵守软件设计原则。今天就把面试工作最常用的三大核心设计原则讲透开闭原则、里氏替换原则、依赖倒置原则。全文配Java代码正反例看完就能用在项目里。前言设计原则不是玄学是前人总结的代码健壮性、可扩展、可维护的底层规律。今天讲的三大原则地位开闭原则OCP设计原则的核心里氏替换原则LSP继承的黄金标准依赖倒置原则DIP解耦的终极手段一、开闭原则 OCP1. 核心思想对扩展开放对修改关闭。扩展新增功能、新增类、新增实现关闭不修改已测试、已上线的稳定代码一句话能加就不加改能扩就不改旧。2. 为什么要遵守不改老代码 不引入新Bug系统更稳定、可维护性更强符合“高内聚低耦合”生活例子电脑USB接口。插U盘、鼠标、键盘不用拆电脑这就是开闭原则。3. 反例违反OCP// 绘制工具类用if-else判断类型违反开闭publicclassShapeDrawer{publicvoiddrawShape(StringshapeType){if(shapeType.equals(Circle)){System.out.println(绘制圆形);}elseif(shapeType.equals(Square)){System.out.println(绘制正方形);}}}问题加三角形必须加else if改老代码风险极高完全违反开闭原则4. 正例遵守OCPStep1定义抽象接口publicinterfaceShape{voiddraw();}Step2具体图形实现publicclassCircleimplementsShape{Overridepublicvoiddraw(){System.out.println(绘制圆形);}}publicclassSquareimplementsShape{Overridepublicvoiddraw(){System.out.println(绘制正方形);}}Step3稳定的绘制工具publicclassShapeDrawer{// 依赖抽象不依赖具体publicvoiddrawShape(Shapes){s.draw();}}扩展三角形完全不用改旧代码publicclassTriangleimplementsShape{Overridepublicvoiddraw(){System.out.println(绘制三角形);}}5. 开闭原则总结核心扩展不改旧关键面向抽象/接口编程目的系统稳定、易扩展、低风险二、里氏替换原则 LSP1. 核心思想子类可以完全替换父类程序行为不变。父类能用的地方子类换上去照样跑逻辑不崩、结果不错。这是继承是否合理的唯一标准。2. 核心理解继承不是为了复用代码继承是为了行为统一子类必须是父类的真正子类型3. 经典反例正方形≠长方形// 父类长方形classRectangle{intwidth;intheight;voidsetWidth(intw){widthw;}voidsetHeight(inth){heighth;}}// 子类正方形错误继承classSquareextendsRectangle{voidsetWidth(intw){widthheightw;}voidsetHeight(inth){widthheighth;}}测试逻辑会崩voidresize(Rectangler){r.setWidth(20);// 预期高度不变}问题子类破坏父类行为约定无法替换父类违反里氏替换4. 正例遵守LSPStep1抽象父类publicabstractclassShape{publicabstractintgetArea();}Step2各自实现publicclassRectangleextendsShape{privateintw,h;publicRectangle(intw,inth){this.ww;this.hh;}OverridepublicintgetArea(){returnw*h;}}publicclassSquareextendsShape{privateintside;publicSquare(intside){this.sideside;}OverridepublicintgetArea(){returnside*side;}}Step3任意替换Shapes1newRectangle(10,20);Shapes2newSquare(10);行为完全一致安全替换。5. 里氏替换总结核心子类能替父类行为不跑偏关键继承看行为不看代码复用目的保证多态安全、系统稳定三、依赖倒置原则 DIP1. 核心思想高层不依赖低层二者都依赖抽象。抽象不依赖细节细节依赖抽象。大白话别直接new具体类依赖接口/抽象类实现可以随便换高层不动2. 为什么重要解耦解耦解耦换组件不用改高层方便测试、方便扩展是Spring/IOC的核心思想3. 反例高层依赖具体实现// 低层MySQL实现publicclassMySQLDao{publicvoidqueryUser(){System.out.println(MySQL查询用户);}}// 高层直接new死强耦合publicclassUserService{privateMySQLDaomySQLDaonewMySQLDao();publicvoidgetUserInfo(){mySQLDao.queryUser();}}问题换Oracle必须改UserService紧耦合、难扩展、难测试4. 正例依赖抽象Step1抽象接口publicinterfaceUserDao{voidqueryUser();}Step2具体实现publicclassMySQLDaoimplementsUserDao{OverridepublicvoidqueryUser(){System.out.println(MySQL查询);}}publicclassOracleDaoimplementsUserDao{OverridepublicvoidqueryUser(){System.out.println(Oracle查询);}}Step3高层依赖抽象publicclassUserService{privateUserDaouserDao;// 注入构造/Setter都行publicUserService(UserDaodao){this.userDaodao;}publicvoidgetUserInfo(){userDao.queryUser();}}使用publicclassTest{publicstaticvoidmain(String[]args){// 随意切换高层代码完全不动UserServiceservicenewUserService(newMySQLDao());service.getUserInfo();servicenewUserService(newOracleDao());service.getUserInfo();}}5. 依赖倒置总结核心依赖抽象不依赖具体关键面向接口编程、依赖注入目的极致解耦、高灵活、易扩展四、三大原则终极总结原则英文一句话口诀核心解决开闭原则OCP能扩不改旧扩展风险、稳定性里氏替换LSP子类能替父类继承安全、多态正确依赖倒置DIP依赖抽象不绑死解耦、扩展、替换一句话串起来用里氏替换保证继承正确用依赖倒置实现解耦最终达到开闭原则——扩展不改、系统稳定。五、课堂小测面试常考新增支付方式直接修改支付工具类 → 违反开闭原则子类替换父类后逻辑异常 → 违反里氏替换原则Service直接new Dao换库要改代码 → 违反依赖倒置原则六、总结这三大原则是设计模式的基础也是高级工程师必备素养。简单工厂 → 工厂方法就是为了遵守开闭Spring IOC/AOP核心就是依赖倒置合理继承必须遵守里氏替换建议收藏每次写代码前对照一遍代码质量直接上一个档次。

相关文章:

软件设计原则详解:开闭原则、里氏替换原则、迪米特法则

软件设计三大核心原则(开闭里氏替换依赖倒置)全网最细讲解,附Java正反例|面试必背 在日常开发中,你一定遇到过这些痛点: 加个小功能,改出一堆Bug继承乱用,逻辑越跑越偏换个数据库/组…...

矽力杰 Silergy SY8024 双路同步降压转换器 规格书 佰祥电子

突破双路降压集成度低、小体积大电流、高频低纹波痛点!SY8024:双路 3A 输出 1.5MHz 高频的五大核心优势便携智能设备双路降压供电场景普遍存在双路供电需双芯片导致体积偏大、高频小体积方案转换效率偏低、双路独立控制与防护能力不足三大行业痛点。作为…...

Spring Boot IoC 实践(二):理解 Bean 的创建与容器管理过程

一、前言在上一篇文章中,我们初步了解了 Spring Boot 启动时如何创建 IoC(控制反转)容器。 这篇文章通过一个简单示例,从代码与日志输出两个角度,带你理解:Spring Boot 在何时创建 Bean?IoC 容器…...

YonSuite如何用“本体智能”破解企业AI落地困局

2026年4月10日,2026成长型企业数智化创新峰会北京站顺利启幕,核心主题就是“本体智能 成长无界——YonSuite让AI在企业落地”。这场由用友YonSuite主办的峰会,聚集了不少行业专家、技术达人以及数百位企业管理者,趁着AI从“演示试…...

Three.js 的前端 WebGL 页面合集(日本 开源项目)

Three.js 的前端 WebGL 页面开发合集 「30 Three.js 的前端 WebGL 页面合集(日本 开源项目)」 /~46363Y8ZWf~:/ 链接:https://pan.quark.cn/s/1644aa234f1f 项目简介 本项目是一个使用 Three.js 进行前端 3D 图形开发的示例集合。每个子页面都…...

AI读片准确率突破99.2%?2026奇点大会首次公开多中心验证数据:放射科医生必须在Q3前掌握的5项新能力

第一章:2026奇点智能技术大会:医学影像分析 2026奇点智能技术大会(https://ml-summit.org) 临床级模型推理流水线部署实践 在大会现场,多家医疗机构联合开源了基于PyTorch Lightning构建的轻量化DICOM推理服务框架MedInfer v3.2。该框架支持…...

LeetCode热题100- 轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。由题目可知,k为非负数一定需要右转,而且当K数组长度时,其实数组是不变的。三步反转法,步骤 1:整体全反转、步骤 2&am…...

玻璃幕墙存在的问题及解决方法浅析

玻璃幕墙存在的问题及解决方法浅析 摘要:本文通过对玻璃幕墙存在的问题进行详细的分析和讨论,并逐一找出解决玻璃幕墙问题的办法。   1、前言...

玻璃幕墙U值理论计算与软件分析的对比

摘要:本文通过对隐框和明框玻璃幕墙的U值理论计算和软件分析对比,寻求二者间计算结果的差别。 关键词:热工,普通明框,隐框,隔热明框,玻璃,理论计算,软件分析。 玻璃幕墙作为建筑的外维护体系,对整个建筑的热工性能有较大影响。我国于2005年4月4日发布<公共建筑节能…...

CasRel模型镜像免配置亮点:预置中文分词器+标点标准化模块

CasRel模型镜像免配置亮点&#xff1a;预置中文分词器标点标准化模块 你是不是也遇到过这种情况&#xff1f;好不容易找到一个强大的关系抽取模型&#xff0c;比如CasRel&#xff0c;兴致勃勃地部署好&#xff0c;准备从中文文本里提取“谁-做了什么-对谁”这样的关键信息。结…...

UniApp里用web-view预览PDF?小心这些性能坑和体验优化点

UniApp中WebView加载PDF的深度优化指南&#xff1a;从性能瓶颈到极致体验 在移动应用开发领域&#xff0c;PDF预览功能几乎是企业级应用的标配需求。UniApp作为跨平台开发框架&#xff0c;通过WebView实现PDF预览看似简单直接&#xff0c;但当项目进入生产环境&#xff0c;特别…...

Mipmap实战解析:从纹理闪烁到视觉平滑的渲染优化之路

1. 纹理闪烁的罪魁祸首&#xff1a;当像素与纹素相爱相杀 第一次在开放世界游戏中看到远处山体像癫痫发作般疯狂闪烁时&#xff0c;我差点以为显卡要烧了。这种被称为"纹理闪烁"的现象&#xff0c;本质上是像素与纹素的比例失衡导致的视觉灾难。想象你站在纽约帝国大…...

保姆级教程:在OpenWrt 22.03上,如何修改并编译你自己的LuCI插件(以ne-cnc为例)

从零开始定制OpenWrt LuCI插件&#xff1a;完整编译与修改实战指南 当你第一次看到OpenWrt路由器上那些功能各异的LuCI插件时&#xff0c;是否曾想过自己也能动手修改它们&#xff1f;本文将带你深入理解LuCI插件的工作原理&#xff0c;并手把手教你如何修改和编译属于自己的定…...

基于Web Serial API的浏览器端RFID卡号读取实战指南

1. Web Serial API与RFID读卡器的奇妙组合 你有没有想过&#xff0c;直接在浏览器里就能读取实体RFID卡的数据&#xff1f;以前要实现这个功能&#xff0c;必须安装本地驱动或者开发桌面应用。但现在只需要一个支持Web Serial API的浏览器&#xff0c;加上几十行JavaScript代码…...

口碑好的高强无收缩灌浆料哪个好

在建筑施工领域&#xff0c;高强无收缩灌浆料的重要性不言而喻。它广泛应用于设备基础灌浆、混凝土结构加固改造等项目中&#xff0c;能够为建筑结构提供稳固的支撑。那么&#xff0c;市场上口碑好的高强无收缩灌浆料究竟哪个好呢&#xff1f;今天就为大家重点推荐中天华固建材…...

为什么92%的多模态情感模型在跨域测试中崩溃?SITS2026首次披露3类隐性模态失配陷阱

第一章&#xff1a;SITS2026多模态情感分析核心洞察 2026奇点智能技术大会(https://ml-summit.org) SITS2026框架重新定义了多模态情感分析的技术边界&#xff0c;其核心在于跨模态对齐粒度的动态可调性与语义冲突消解机制。该系统不再依赖静态模态权重融合&#xff0c;而是通…...

大数据分布式集群搭建与运维基础

前言在数字化高速发展的今天&#xff0c;大数据已经成为企业核心竞争力的重要组成部分。大数据分布式集群作为存储与计算海量数据的基础平台&#xff0c;其搭建、配置、管理与稳定运行&#xff0c;是大数据运维工作的重中之重。对于初学者而言&#xff0c;环境搭建复杂、网络异…...

AIAgent能支撑AGI吗?SITS2026圆桌激辩实录:8大底层能力缺口与2026年前必须攻克的3座技术高峰

第一章&#xff1a;SITS2026圆桌&#xff1a;AIAgent与AGI的关系 2026奇点智能技术大会(https://ml-summit.org) AIAgent 与 AGI 并非线性演进关系&#xff0c;而是认知架构、目标建模与自主演化能力的质变交界。在 SITS2026 圆桌讨论中&#xff0c;多位前沿研究者指出&#…...

【紧急预警】AIAgent服务注册中心已成单点瓶颈!4种去中心化治理方案对比实测(QPS提升3.8倍,延迟压降至8ms)

第一章&#xff1a;AIAgent架构服务治理方案 2026奇点智能技术大会(https://ml-summit.org) AIAgent系统在规模化部署中面临服务异构性高、生命周期动态性强、策略协同复杂等挑战&#xff0c;传统微服务治理模式难以支撑其可观测性、弹性扩缩与策略闭环能力。本章聚焦于构建面…...

Redis Cluster 故障自动恢复机制

Redis Cluster作为分布式缓存系统的标杆&#xff0c;其故障自动恢复机制是保障高可用的核心设计。当节点宕机或网络分区时&#xff0c;系统能在秒级完成主从切换与数据迁移&#xff0c;这种"自愈"能力如何实现&#xff1f;本文将揭秘其背后的关键技术。 **主从切换原…...

多模态大模型数据投毒攻击:如何在训练阶段识别隐匿后门、阻断跨模态污染并验证模型可信性?

第一章&#xff1a;多模态大模型安全与隐私保护 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在融合文本、图像、音频和视频等异构数据时&#xff0c;显著扩大了攻击面与隐私泄露风险。训练数据中隐含的敏感身份信息、生成内容中的偏见放大、跨模态推理导致的语…...

【AIAgent TCO控制白皮书】:基于17个生产环境数据验证的8类资源浪费模式与自动化治理方案

第一章&#xff1a;AIAgent架构成本优化策略总览 2026奇点智能技术大会(https://ml-summit.org) AI Agent系统在生产环境中常面临推理延迟高、模型调用频次失控、上下文冗余膨胀等导致的云资源成本陡增问题。成本优化并非仅聚焦于模型压缩或硬件降配&#xff0c;而需贯穿设计、…...

机器学习调参避坑指南:caret包trainControl函数这些参数你设置对了吗?

机器学习调参避坑指南&#xff1a;caret包trainControl函数这些参数你设置对了吗&#xff1f; 在机器学习项目中&#xff0c;调参往往是决定模型性能的关键环节。R语言中的caret包因其统一简洁的接口设计&#xff0c;成为许多数据科学家的首选工具。而trainControl函数作为care…...

基于无锚框机制改进YOLOv5的候选框生成:从原理到完整代码实现

摘要 YOLOv5作为目标检测领域的经典算法,其基于锚框(Anchor Box)的候选框生成机制虽然在多数场景下表现优异,但存在超参数敏感、泛化能力受限等固有问题。本文提出一种基于无锚框(Anchor-Free)机制改进YOLOv5候选框生成的方法,通过引入中心点预测与尺度回归分支,彻底摆脱对…...

CSDN读者问答精选:关于Token-Flow使用中的7个高频问题(第二期)

本周继续回答读者关于Token-Flow的高频问题。Q1&#xff1a;智能路由的“auto-router”和“auto-router-v2”有什么区别&#xff1f;A&#xff1a;V2增加了语义路由功能。V1主要根据任务长度&#xff08;Token数&#xff09;和关键词判断&#xff1b;V2会通过轻量级嵌入模型识别…...

PMP题库_03_进度管理

PMP 项目管理专业认证 题库精选系列 知识领域&#xff1a;项目进度管理题库精选 第3章 | Chapter 3适用考试PMP 第七版/第八版题目数量56道精选题目重点内容关键路径法、关键链、资源平衡、进度压缩题目类型概念题 计算题 情景题 目录 一、规划进度管理 8道题二、定义活动 8道…...

AIAgent架构中的对抗攻击防御体系(2024最新NIST合规框架实测版)

第一章&#xff1a;AIAgent架构中的对抗样本防御 2026奇点智能技术大会(https://ml-summit.org) 在多层协同的AIAgent系统中&#xff0c;对抗样本不再仅威胁单个模型组件&#xff0c;而是可能通过意图解析、工具调用、记忆检索等模块链式传播&#xff0c;导致任务失败或行为偏…...

PHP+JS+CSS打造动态星盘计算器

基于PHPJSCSS的星盘工具开发实践引言占星术作为一种古老的文化现象&#xff0c;在现代数字时代焕发新生。星盘工具允许用户输入出生信息&#xff08;如日期、时间和地点&#xff09;&#xff0c;动态生成天体位置图&#xff0c;直观展示行星在黄道带的分布。开发此类工具需要高…...

“AI写的歌能拿格莱美吗?”——2026奇点大会法律与艺术双委员会联合声明:原创性认定新标准、人类协作度黄金阈值(≥37.6%)首次发布

第一章&#xff1a;AI音乐创作的格莱美资格争议与奇点大会历史意义 2026奇点智能技术大会(https://ml-summit.org) 2024年&#xff0c;美国国家录音艺术与科学学院&#xff08;The Recording Academy&#xff09;正式修订《格莱美奖参赛规则》&#xff0c;明确将“由AI生成且…...

租户上下文污染、模型缓存穿透、向量库跨租户泄漏……AIAgent架构中5大隐性隔离漏洞(附可审计的OpenTelemetry追踪模板)

第一章&#xff1a;AIAgent架构多租户隔离方案 2026奇点智能技术大会(https://ml-summit.org) 在面向企业级服务的AIAgent平台中&#xff0c;多租户隔离不仅是安全合规的硬性要求&#xff0c;更是资源调度、模型推理与上下文管理的核心设计约束。隔离需贯穿数据层、运行时环境…...