设计模式SOLID原则

在Java编程中,SOLID原则是一组被广泛接受和应用的面向对象设计原则,旨在提高软件设计的灵活性、可维护性和可扩展性。这五个原则分别是:

1. 单一责任原则(Single Responsibility Principle, SRP)

定义:一个类应该只有一个引起它变化的原因,即一个类只负责一个职责。

解释:这个原则强调类的职责应该被清晰定义且尽量单一,以便在将来修改或扩展时能够保持类的稳定性。如果一个类承担了过多的职责,那么这些职责之间可能会相互影响,增加代码的复杂性和维护成本。

示例

  • 一个类负责处理用户的登录信息,就不应该再负责处理用户的支付信息。
  • 如果一个类同时包含了计算和打印发票的逻辑,那么它违反了单一责任原则,应该被拆分为两个类:一个负责计算,另一个负责打印。

2. 开放封闭原则(Open/Closed Principle, OCP)

定义:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。

解释:这个原则要求软件实体在保持稳定的同时,也具备扩展新功能的能力。这意味着我们应该通过添加新的类或方法来扩展功能,而不是修改现有的代码。

示例

  • 使用接口和多态性来实现不同的算法或行为,这样可以在不修改现有代码的情况下添加新的算法实现。
  • 在实现图形界面时,可以通过扩展不同的组件来添加新的功能,而不是修改现有的组件。

3. 里氏替换原则(Liskov Substitution Principle, LSP)

定义:子类对象应该可以替换父类对象,且程序行为保持不变。

解释:这个原则要求子类必须能够替换其基类对象,而不会导致程序的错误或行为的变化。子类应该增强而不是削弱父类的行为。

示例

  • 如果有一个表示鸟类的基类,并且有一个表示鸽子的子类,那么鸽子类应该能够完全替代鸟类基类在任何使用鸟类基类的地方,而不会导致程序出错。
  • 如果子类的方法修改了父类方法的预期行为,那么这就违反了里氏替换原则。

4. 接口隔离原则(Interface Segregation Principle, ISP)

定义:不应该强迫一个类实现它不需要的接口,应将大接口拆分成更小的、特定的接口。

解释:这个原则要求接口的设计应该尽量小且专一,以避免出现“胖接口”的情况。一个类应该只依赖于它需要的方法,而不是依赖于它不需要的方法。

示例

  • 如果有一个表示动物的大接口,它包含了动物的各种行为(如走、跑、飞等),那么对于那些只能走或跑的动物来说,它们就不得不实现飞这个它们并不需要的方法,这就违反了接口隔离原则。更好的做法是将这个大接口拆分成多个小接口,如走接口、跑接口和飞接口等。

5. 依赖倒置原则(Dependency Inversion Principle, DIP)

定义:高层次的模块不应该依赖低层次的模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。

解释:这个原则要求我们在设计中尽量使用抽象层(如接口或抽象类)来建立模块之间的关系,而不是直接使用具体的实现类。这样做的好处是可以降低模块之间的耦合度,提高系统的灵活性和可扩展性。

示例

  • 在一个电商系统中,订单处理模块可能会依赖于支付模块。按照依赖倒置原则,订单处理模块不应该直接依赖于具体的支付实现类,而应该依赖于一个支付接口。这样,我们就可以在不修改订单处理模块的情况下,轻松地更换支付模块的实现。

综上所述,SOLID原则是Java编程中非常重要的设计原则,它们可以帮助我们编写出更加灵活、可维护和可扩展的代码。在实际开发中,我们应该时刻牢记这些原则,并在实践中加以应用。

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

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

相关文章

机器学习(二十):偏差和方差问题

一、判断偏差和方差 以多项式回归为例,红点为训练集数据,绿点为交叉验证数据。 下图的模型,训练集误差大,交叉验证集误差大,这代表偏差很大 下图的模型,训练集误差小,交叉验证集误差小&#x…

等级保护 总结2

网络安全等级保护解决方案的主打产品: HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…

外卖霸王餐系统架构怎么选?

在当今日益繁荣的外卖市场中,外卖霸王餐作为一种独特的营销策略,受到了众多商家的青睐。然而,要想成功实施外卖霸王餐活动,一个安全、稳定且高效的架构选择至关重要。本文将深入探讨外卖霸王餐架构的选择,以期为商家提…

AI绘画进阶工具 ComfyUI 新版来啦!操作界面详解!取消悬浮面板,自带工作流管理功能!(附安装包)

大家好,我是画画的小强 在 7 月初的一次更新中,ComfyUI 官方推出了 Beta 版 UI,取消了原本的悬浮面板,还新增了工作流管理功能,整体使用体验比之前好了很多。今天就为大家详细介绍一些新版 UI 的特点和用法。 一、启…

iOS中的MVVM设计模式

目录 前言 一、MVVM简介 二、MVVM的核心思想 三、MVVM的优势 四、MVVM在iOS中的实现 1. 创建Model 2. 创建ViewModel 3. 创建View 4. 主入口 总结 前言 随着iOS开发的发展,构建可维护和可扩展的代码架构变得至关重要。Model-View-ViewModel (MVVM) 是一种…

【STM32】超声波一般常用哪两个引脚?

在STM32单片机中,超声波模块HC-SR04通常使用PA6和PA7引脚进行驱动。 在STM32单片机上使用HC-SR04超声波模块时,常用的引脚是PA6和PA7。其中,PA6用于发送触发信号到Trig引脚,而PA7用于接收Echo引脚的回响信号。这两个引脚通过适当的…

pdf2image:将PDF文档转化为图像的Python魔法

标题:探索pdf2image:将PDF文档转化为图 像的Python魔法 背景 在数字时代,我们经常需要处理各种格式的文档,尤其是PDF文件。PDF以其跨平台的可读性和稳定性而广受欢迎。然而,有时我们需要将PDF文件转换成图像格式&am…

springboot3-web-questions-分析

系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 一、问题案例 1、maven项目compile时候出现告警warn 2、java文件打包然后在命令行中运行java会找不到主类 3、程序找不到数据库驱动和配置实例 4、springboot和mybatis-plus版本不兼容导致 5、springboot项目启动的解释…

sklearn中的增量学习:特征提取的艺术

sklearn中的增量学习:特征提取的艺术 在机器学习领域,特征提取是构建有效模型的关键步骤。然而,并非所有数据集都适合一次性加载到内存中进行处理,尤其是在处理大规模数据集时。Scikit-learn(sklearn)提供…

21、Python之面向对象:一切皆对象,可你真的需要面向对象吗

引言 面向对象(Object-Oriented Programming, OOP)和面向过程(Procedural Programming)是两种不同的编程范式。不能因为我们接下来要进入“面向对象”的模块的学习,就武断地说,面向对象一定比面向过程好。…

若依 ruoyi poi Excel合并行的导入

本文仅针对文字相关的合并做了处理 ,图片合并及保存需要另做处理!! 目标:Excel合并行内容的导入 结果: 1. ExcelUtil.java 类,新增方法:判断是否是合并行 /*** 新增 合并行相关代码:…

【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

计网_数据通信基础知识

2024.07.05:计算机网络数据通信基础知识学习笔记 第2节 数据通信基础知识 2.1 物理层特性(学会区分)2.2 信道相关的基本概念2.2.1 数字信号的(基带调制)(1)不归零NRZ编码(2&#xff…

大模型日报 2024-07-25

大模型日报 2024-07-25 大模型资讯 Meta发布开源AI模型Llama 3.1 405B 摘要: Meta于周二宣布推出Llama 3.1 405B,这是一款大型语言模型,旨在与Anthropic、谷歌和OpenAI的顶级模型竞争。 Meta发布全球最大AI模型Llama 3.1 405B 摘要: Meta今日发布了其迄今…

在Typescript + Pinia 中使用 Actions

文件准备 type.ts import type { PiniaCustomProperties, StateTree, StoreDefinition, _GettersTree, _StoreWithGetters, _StoreWithState } from pinia; import type { UnwrapRef } from vue;/**构建 Actions */ type CreateActions<Id extends string, S extends StateT…

1207. 有趣的数字图形IV

问题描述 输入一个整数 &#x1d45b; &#xff08; &#x1d45b;≤12 &#xff09;&#xff0c;打印出如下要求的方阵&#xff1a; 除掉右上到左下对角线上的数外的右下半个区域中每个元素等于左边的和上面的元素之和。每个元素场宽为 5 。左上半个区域为空。 输入 一个整…

C语言------指针讲解(3)

一、字符指针 在指针中&#xff0c;我们知道有一类指针类型为字符指针char*; int main() {char ch w;char* pc &ch;*pc w;return 0; } 还有一种使用方式如下&#xff1a; 上述代码中&#xff0c;本质是把hello的首字符的地址放到了pstr中。即把一个常量字符串的首字符…

C++图书管理系统

目录 实现功能 用户管理 图书管理 借阅与归还 未归还图书 部分效果图 结构体 Book 结构体 User 结构体 源代码 编译时在连接器命令行加入 完整代码 实现功能 用户管理 添加用户&#xff1a;输入用户ID、用户名和密码…

【LeetCode】71.简化路径

1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…

ffmpeg 怎样分析ts 流中的 sdt 表

--------------------------------------------------------- author:hjjdebug date: 2024年 07月 24日 星期三 10:34:08 CST descriptor: ffmpeg 怎样分析ts 流中的 sdt 表 --------------------------------------------------------- 1. sdt 的概念 sdt 就是服务描述表&a…