尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【面向对象】面向对象设计原则:SOLID五大原则
考点频率★★★★★上午选择题必考下午题设计类图时也常需体现这些原则难度⭐⭐⭐建议重点理解每个原则的核心含义和软考常考表述能根据场景判断是否违反了某条原则1️⃣ 为什么要学SOLID前面我们学了面向对象的三大特性封装、继承、多态但“会用”不等于“用好”。三个特性只能保证你写出面向对象的代码但写出来的代码是不是容易维护、容易扩展、容易测试——那是另外一回事。SOLID五大原则就是面向对象设计的“最佳实践清单”。它们告诉你怎么用封装、继承、多态才能写出“好”的代码。这五个原则合起来就是为了实现一个终极目标高内聚、低耦合。2️⃣ 单一职责原则SRPSingle Responsibility Principle定义一个类应该只有一个引起它变化的原因。换句话说一个类只负责一个功能领域的职责。核心思想一个类只做一件事。如果一件事做不好需要改不会连累其他不相干的功能。软考常考表述“将不同的职责分离到不同的类中”“一个类只承担一个职责”“变化点分散到不同的类中”反面示例违反SRPclass 员工 { 计算工资() // 财务部门关心 保存到数据库() // DBA关心 生成报表() // 管理层关心 }三个不同的职责混在一起改工资算法可能会影响数据库操作。正确做法拆成工资计算器、员工仓库、报表生成器三个独立的类。一句话一个类一个职责一个改动的理由。3️⃣ 开闭原则OCPOpen-Closed Principle定义软件实体类、模块、函数等应该对扩展开放对修改关闭。核心思想当需求变化时你应该通过新增代码来实现新功能而不是修改现有代码。软考常考表述“不修改原有代码通过扩展来实现新功能”“抽象化是开闭原则的关键”“面向接口编程”反面示例违反OCPclass 绘图 { 画(形状) { if (形状是圆形) { 画圆() } else if (形状是方形) { 画方() } // 新增三角形时要修改这个类 } }正确做法遵循OCPinterface 形状 { 画() } class 圆形 implements 形状 { 画() { 画圆 } } class 方形 implements 形状 { 画() { 画方 } } // 新增三角形只需新增类不修改已有代码一句话不改旧代码只加新代码。抽象是钥匙接口是锁芯。本质开闭原则是SOLID中最核心、最抽象的原则其他几个原则都是在不同层面上支撑“对扩展开放、对修改封闭”的手段。单一职责保证修改影响范围小里氏替换保证扩展不破坏继承体系接口隔离和依赖倒置保证扩展不引入不必要的依赖。4️⃣ 里氏替换原则LSPLiskov Substitution Principle定义子类型必须能够替换掉它们的父类型。凡是父类出现的地方子类都应该能够代替父类出现且程序行为不变。核心思想继承不能破坏父类的行为契约。子类可以扩展父类的功能但不能改变父类原有的行为含义。软考常考表述“子类可以替换父类”“子类不应重写父类中已定义的方法来改变其预期行为”“继承关系应该符合 is-a 关系”特别注意里氏替换原则是五个原则中最容易混淆的一个。它的关键不在于“子类能不能替换父类”语法上当然能而在于“替换后程序行为是否正确”。反面示例违反LSP——经典长方形/正方形问题class 长方形 { 设置宽度(w) { 宽度 w } 设置高度(h) { 高度 h } } class 正方形 extends 长方形 { 设置宽度(w) { 宽度 w; 高度 w } // 破坏了父类的契约 设置高度(h) { 高度 h; 宽度 h } // 父类说宽高独立子类说必须相等 }使用场景中如果某个函数要求宽高独立变化传入正方形就会出错。一句话子类可以替换父类且替换后程序照样跑。不改变父类行为的预期是底线。5️⃣ 接口隔离原则ISPInterface Segregation Principle定义客户端不应该被迫依赖它不使用的接口。应该将胖接口拆分成多个专一的小接口。核心思想一个类实现了某个接口就必须实现该接口的所有方法。如果接口里有这个类根本用不到的方法就说明接口设计得太“胖”了。软考常考表述“将大接口拆分为多个小接口”“不应该强迫用户依赖他们不需要的方法”“接口的粒度要小”反面示例违反ISPinterface 多功能设备 { 打印() 扫描() 传真() } class 普通打印机 implements 多功能设备 { 打印() { ... } 扫描() { 抛出异常 } // 普通打印机不支持扫描 传真() { 抛出异常 } // 普通打印机不支持传真 }正确做法拆分为可打印、可扫描、可传真三个独立接口。一句话胖接口拆成小接口别让实现类被迫实现它用不上的方法。6️⃣ 依赖倒置原则DIPDependency Inversion Principle定义高层模块不应该依赖低层模块二者都应该依赖其抽象抽象不应该依赖细节细节应该依赖抽象。核心思想要面向接口编程不要面向实现编程。依赖关系应该终止于抽象类或接口。软考常考表述“依赖抽象不依赖具体”“高层模块和低层模块都依赖接口”“抽象不依赖具体实现”反面示例违反DIPclass 支付服务 { 支付宝 支付工具; // 直接依赖具体类 支付() { 支付工具.扣款() } } // 如果要换成微信支付必须修改支付服务代码正确做法遵循DIPinterface 支付方式 { 扣款() } class 支付宝 implements 支付方式 { 扣款() { ... } } class 微信支付 implements 支付方式 { 扣款() { ... } } class 支付服务 { 支付方式 支付工具; // 依赖接口不依赖具体实现 支付() { 支付工具.扣款() } }一句话依赖接口不依赖具体类。细节依赖抽象抽象不依赖细节。7️⃣ SOLID五原则速查表原则缩写核心要点软考关键词单一职责SRP一个类只有一个职责一个职责、一个变化原因开闭原则OCP对扩展开放对修改关闭不修改原有代码、扩展里氏替换LSP子类可替换父类且行为不变子类替换父类、不改变预期行为接口隔离ISP胖接口拆成小接口不依赖不需要的方法、拆分接口依赖倒置DIP依赖抽象不依赖具体面向接口编程、依赖抽象8️⃣ 经典例题例题1某系统在增加新功能时只需要添加新的类而不需要修改现有类这体现了 原则。A. 单一职责B. 开闭原则C. 里氏替换D. 接口隔离解析“增加新功能而不修改现有类”是开闭原则的典型表述。选B。例题2某系统定义了一个“员工”类包含了计算工资、保存到数据库、生成报表三个方法。有开发人员建议将这个类拆分为三个独立的类。该建议主要依据 原则。A. 单一职责B. 开闭原则C. 接口隔离D. 依赖倒置解析将不同职责拆分到不同类中是单一职责原则的典型应用。选A。9️⃣ 记忆口诀单开里接依——SOLID要牢记。单一职责管好自己事开闭扩展不修旧。里氏子替父行为不走样。接口隔离拆胖接依赖倒置面向接口留。 小测验评论区对答案某系统中类A直接依赖于类B的具体实现。系统引入了一个新功能需要将类B替换为类C结果导致类A的代码也必须修改。这最可能违反了 原则。A. 单一职责B. 开闭原则C. 里氏替换D. 依赖倒置本专栏日更点击头像 → 专栏《软考中级高频考点》订阅第一时间接收新内容#软考中级 #软件设计师 #SOLID #单一职责 #开闭原则 #里氏替换 #接口隔离 #依赖倒置 #软考备考
RELATED

相关推荐

Windows-build-tools终极指南:3分钟搞定Windows开发环境配置

Windows-build-tools终极指南:3分钟搞定Windows开发环境配置

Windows-build-tools终极指南:3分钟搞定Windows开发环境配置 【免费下载链接】windows-build-tools :package: Install C Build Tools for Windows using npm 项目地址: https://gitcode.com/gh_mirrors/wi/windows-build-tools 还在为Windows上编译Node.js原…

📅 2026/9/13 5:20:19
2026企业官网搭建平台有哪些?哪个可以自助搭建不费力?

2026企业官网搭建平台有哪些?哪个可以自助搭建不费力?

2026企业官网搭建平台有哪些?哪个可以自助搭建不费力?据艾瑞咨询联合IDC发布的《2026中国企业数字化建站行业白皮书》显示,2026年国内网站建设行业整体市场规模已突破980亿元,年复合增长率达18.7%。与此同时,全国使用互…

📅 2026/9/5 14:10:16
LLM拓扑病理学框架下大语言模型不可修复的根本性问题研究

LLM拓扑病理学框架下大语言模型不可修复的根本性问题研究

LLM拓扑病理学框架下大语言模型不可修复的根本性问题研究 作者:方见华 单位:世毫九实验室 核心论断摘要 LLM拓扑病理学框架(世毫九实验室)将主流自回归Transformer架构大语言模型的所有原生顽疾,归因于两个架构内嵌、拓…

📅 2026/9/19 12:03:21
MORE NEWS

更多资讯

📰

Cortex-M IAP升级死机根因:中断向量表重映射禁忌

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

别再问“AI写论文哪个第一”了:直播运营专业毕业论文,工具选对才省事 [特殊字符][特殊字符]

如果你读的是网络直播与运营专业,大概率会遇到一种很典型的毕业任务:以某个直播间、账号或直播电商现象为对象,完成一篇带有调研数据和运营策略分析的毕业论文。 比如题目可以很具体:《县域农产品直播间用户停留时长的影响因素研究…

📰

口岸高峰那篇毕业论文,到底该让哪个 AI 帮你?[特殊字符]

边防管理专业的同学大概都懂一种“夹在中间”的写作状态:题目既要像法学,又要像公安学;既要讲法律法规,又要懂口岸运行、边检执法、边境治理和部门协同。 比如这篇毕业论文就很典型: 《陆路口岸高峰期大客流应急协同治…

📰

前端学AI:从大模型API到Agent应用的学习路径与实战指南

说实话,这两年前端圈的人多少都有点焦虑。前几年面试问的是“你怎么优化首屏”,后来问“你怎么设计组件库”,现在面试官张嘴就问“你会不会AI”。我自己也经历过那个阶段:朋友说自己在做AI应用,我想说我也在用AI——Co…

📰

轨道病害论文写到头秃?这份 AI 工具搭配清单,铁道工程同学请收好 [特殊字符]

先说身份:铁道工程技术专业,交通运输大类铁道运输类那条线。我们这个专业,平时学的是线路、轨道、路基、桥隧,毕业前几乎绕不开一类任务——结合一段真实线路,写一份病害分析与养护维修方向的毕业设计(论文…

📰

基于深度学习的智能坐姿检测系统:Python+PyTorch实战

简介:面向计算机视觉与人工智能方向的学生,一套基于深度学习的智能坐姿检测完整源码与配套数据集,可满足课程设计、期末大作业或毕业设计的落地需求。整个项目以Python实现,核心代码覆盖数据读取与预处理、模型结构定义、训练流程…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬