【Java 设计模式】设计原则之单一职责原则
文章目录
- 1. 定义
- 2. 好处
- 3. 应用
- 4. 示例
- 结语
在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。
这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。
✨单一职责原则(SRP)
✨开放/封闭原则(OCP)
✨里氏替换原则(LSP)
✨依赖倒置原则(DIP)
✨接口隔离原则(ISP)
✨合成/聚合复用原则(CARP)
✨迪米特法则(LoD)
在面向对象设计中,单一职责原则是一个重要的设计原则之一。它提倡一个类应该只有一个原因引起变化,即一个类应该只有一个职责。在本文中,我们将深入研究单一职责原则,了解它的定义、优势以及如何在实际开发中应用。
1. 定义
单一职责原则是由罗伯特·C·马丁(Robert C. Martin)提出的,它规定一个类应该只有一个引起变化的原因。换句话说,一个类应该只有一个职责。如果一个类负责太多的事情,那么一旦需求变化,可能需要修改该类的多个部分,增加了代码的复杂性,也增加了引入错误的风险。
2. 好处
单一职责原则有助于提高代码的可维护性、可读性和可扩展性,以下是一些应用单一职责原则的好处:
-
代码清晰度: ,
类的职责单一,使得每个类的代码都相对简单清晰,易于理解。
-
可维护性:
当系统变化时,我们只需关注与变化相关的类,而不必修改其他部分的代码,减少了出错的可能性。
-
可复用性:
单一职责原则有助于提高代码的可复用性,因为一个类只负责一种职责,可以更方便地在其他上下文中重用。
-
测试方便:
每个类的职责单一,使得单元测试更容易编写,测试代码覆盖更全面。
3. 应用
在应用单一职责原则时,我们可以考虑以下几个方面:
-
分离关注点:
确保一个类只关注一个主题或功能领域。如果一个类处理用户输入和数据存储,就有可能违反了单一职责原则。
-
提取子类或新类:
当一个类的职责变得过于复杂时,可以考虑将其拆分成几个更小、更具体的类,每个类负责一个明确定义的职责。
-
遵循高内聚、低耦合原则:
高内聚表示一个类应该有高度相关的职责,而低耦合表示类之间的关系应该尽可能松散。这有助于确保每个类的变化不会对其他类产生过多的影响。
4. 示例
假设我们有一个 UserService 类,负责用户的注册、登录等操作,同时也负责记录用户操作的日志。这就违反了单一职责原则,因为用户管理和日志记录是两个不同的关注点。
package com.cheney.demo.service;import com.cheney.demo.model.User;@Service
public class UserService {public void registerUser(User user) {log("用户注册: " + user.getUsername());}public void loginUser(String username, String password) {log("用户登陆: " + username);}private void log(String message) {System.out.println("Log: " + message);}
}
为了遵循单一职责原则,我们可以将日志记录的职责抽取出去,创建一个独立的 Logger 类:
package com.cheney.demo.common;public class Logger {public void log(String message) {// 日志记录逻辑System.out.println("Log: " + message);}
}
然后在 UserService 中使用 Logger 类:
package com.cheney.demo.service;import com.cheney.demo.common.Logger;
import com.cheney.demo.model.User;
import org.springframework.stereotype.Service;@Service
public class UserService {private Logger logger;public UserService(Logger logger) {this.logger = logger;}public void registerUser(User user) {// 用户注册逻辑logger.log("用户注册: " + user.getUsername());}public void loginUser(String username, String password) {// 用户登录逻辑logger.log("用户登陆: " + username);}
}
这样,UserService 类现在只关注用户管理的职责,而日志记录的职责交给了专门的 Logger 类,保持了单一职责原则的应用。
结语
单一职责原则是面向对象设计中一个基本且重要的原则,它有助于创建清晰、可维护、可扩展的代码。通过确保每个类只有一个职责,我们可以降低代码的复杂性,提高代码的质量。在实际项目中,遵循单一职责原则可以为团队提供更好的代码结构,减少维护的难度,使得系统更容易适应变化。
相关文章:
【Java 设计模式】设计原则之单一职责原则
文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。 ✨单一职责原则(SRP) ✨开放/封闭原则(…...
实现导航栏吸顶操作
一、使用VueUse插件 // 安装 npm i vueuse/core二、点击搜索useScroll 2.1搜索结果如图 三、使用 // 这是示例代码 import { useScroll } from vueuse/core const el ref<HTMLElement | null>(null) const { x, y, isScrolling, arrivedState, directions } useSc…...
Docker简述与基础部署详解
目录 docker概述 docker的核心思想 docker三大组件 docker优势 容器和虚拟机之间的区别 容器在内核中支持的重要技术 命名空间(Namespaces) 控制组(Control Groups,cgroups) 写时复制技术(Copy-on…...
(南京观海微电子)——色温介绍
色温是表示光线中包含颜色成分的一个计量单位。从理论上说,黑体温度指绝对黑体从绝对零度(-273℃)开始加温后所呈现的颜色。黑体在受热后,逐渐由黑变红,转黄,发白,最后发出蓝色光。当…...
入门Linux简单操作
基本命令 scp ✓ scp -r 文件 127.0.0.1:/root/文件 (source->>>>destination) mv cp ✓ cp xxxx ./xxxx date ✓ 修改时间 date -s “yyyy-MM-dd 12:12:59” find ✓ find /home/user -name “*.txt” grep ✓ 管道 软连接 多用户 免密设置 脚…...
操作系统复习 一、二章
操作系统复习 一、二章 文章目录 操作系统复习 一、二章第一章 计算机系统概述处理器中各寄存器的作用指令的执行过程中断存储器层次结构和CacheI/O 通信技术 第二章 操作系统概述大内核微内核大内核微内核 操作系统的定义、目标和功能定义目标和功能 操作系统的发展过程现代操…...
【国内访问github不稳定】可以尝试fastgithub解决这个问题
1、下载 https://github.com/dotnetcore/FastGithub https://github.com/dotnetcore/FastGithub/releases 官网下载即可,比如,我用的是这个:fastgithub_osx-x64.zip(点这里下载) 2、安装 如下图双击启动即可 3、…...
android:clickable=“false“无效,依然能被点击
android:clickable“false”依然能被点击,该属性意义何在? 在Android中,android:clickable 属性用于指定一个视图(View)是否可以被点击。当你设置 android:clickable"true" 时,表示该视图可以接…...
Springboot WebFlux项目结合mongodb进行crud
第一步:创建项目 第二步:给mongodb插入数据 第三步:创建实体类 package org.cyl.test02.entity;// Task.java import lombok.Data;Data public class Task {private String id;private String description; }第四步:创建Reposito…...
超维空间M1无人机使用说明书——61、ROS无人机物体识别与精准投放
引言:基于空中物流的项目背景。我们提供了使用基于诗句的物体识别和精准投放、降落。实现原理如下: 1、在ROS下使用机载电脑实现物体识别 2、记载电脑根据反馈的位置发布运动控制指令 3、PX4解析机载电脑发布的命令,作出运动控制 4、设置…...
Flask 小程序菜品搜索
mina/pages/food/index.wxml <!--index.wxml--> <!--1px 750/320 2.34rpx;--> <view class"container"><!--轮播图--><view class"swiper-container"><swiper class"swiper_box" autoplay"{{autoplay}…...
Excel·VBA按指定顺序排序函数
与之前写过的《ExcelVBA数组冒泡排序函数》不同,不是按照数值大小的升序/降序对数组进行排序,而是按照指定数组的顺序,对另一个数组进行排序 以下代码调用了《ExcelVBA数组冒泡排序函数》bubble_sort_arr函数(如需使用代码需复制…...
数据结构学习笔记——查找算法中的树形查找(红黑树)
目录 一、红黑树的定义(一)黑/红结点、叶子节点(二)黑色完美平衡 二、红黑树的性质(一)黑高和高度(二)叶子结点个数 三、红黑树与AVL对比 一、红黑树的定义 红黑树是一棵二叉排序树…...
Debezium发布历史66
原文地址: https://debezium.io/blog/2019/07/25/debezium-0-10-0-beta3-released/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Debezium 0.10.0.Beta3 发布 七月 25, 2019 作者: Jir…...
Redis系列之使用Lua脚本
什么是lua脚本? lua语言是一个轻量级的脚本语言,可以嵌入其他语言中使用,调用宿主语言的功能。lua语法简单,小巧,源码一共才200多K,本身不会有太强的功能,很多的语言也支持lua语言,…...
Wargames与bash知识16
Wargames与bash知识16 Bandit24 关卡提示: 一个守护进程正在端口30002上侦听,如果给定bandit24的密码和一个4位数的密码,它将为您提供bandit25的密码。没有办法检索pincode,除非遍历所有10000个组合,称为暴力强制。您…...
关于运维·关于数据库面试题
目录 一、数据库类型 二、数据库引擎 三、mysql数据库类型 四、mysql的约束添加 五、主从复制原理 六、主从方式有几种 七、mysql主从数据不一致的原因 八、mysql的优化 九、什么是事务的特征 十、数据库读写分离的好处 十一、怎样优化sql语句 十二、mysql的同步方…...
MySQL题目示例
文章目录 1.题目示例 1.题目示例 09)查询学过「张三」老师授课的同学的信息 SELECT s.*, c.cname, t.tname, sc.score FROM t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc WHERE t.tid c.tid AND c.cid sc.cid AND sc.sid s.sid …...
HTML基本语法
HTML基本语法 1.介绍: 1.1超文本: 指的是网页中可以显示的内容(图片,超链接,视频…) 1.2标记:标签(通过标记符号来告诉浏览器网页内容该如何显示) 标记语言中,提供了许多的标签,不同的标签…...
二分图最大匹配——匈牙利算法详解
文章目录 零、前言一、红娘牵线二、二分图最大匹配2.1概念2.2交替路2.3增广路2.4匈牙利算法2.4.1算法原理2.4.2算法示例2.4.3代码实现 3.OJ练习3.1模板3.2棋盘覆盖3.3車的放置 零、前言 关于二分图的基本知识见:二分图及染色法判定 一、红娘牵线 一位红娘近日遇到一…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
