【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車的放置 零、前言 关于二分图的基本知识见:二分图及染色法判定 一、红娘牵线 一位红娘近日遇到一…...
Pixel Fashion Atelier部署教程:Stable Diffusion像素时装生成工作站保姆级安装指南
Pixel Fashion Atelier部署教程:Stable Diffusion像素时装生成工作站保姆级安装指南 1. 项目介绍 Pixel Fashion Atelier(像素时装锻造坊)是一款基于Stable Diffusion与Anything-v5模型的图像生成工作站。与传统AI工具不同,它采…...
Cogito-v1-preview-llama-3B效果展示:中英日法等30+语言生成质量对比
Cogito-v1-preview-llama-3B效果展示:中英日法等30语言生成质量对比 1. 模型核心能力概览 Cogito v1预览版是Deep Cogito推出的混合推理模型系列,在大多数标准基准测试中均超越了同等规模下最优的开源模型。这个3B参数的模型在编码、STEM、指令执行和通…...
精读《Harness design for long-running application development》:真正拉开差距的,不是模型本身,而是你怎么给它harness
精读《Harness design for long-running application development》:真正拉开差距的,不是模型本身,而是你怎么给它搭脚手架 原文:Harness design for long-running application development Anthropic 这篇文章最值得读的地方&a…...
SeqGPT-560M惊艳效果:支持多值字段提取——同一段文本中识别全部手机号而非仅首个
SeqGPT-560M惊艳效果:支持多值字段提取——同一段文本中识别全部手机号而非仅首个 在信息爆炸的时代,我们每天都要处理海量的非结构化文本。无论是从一份简历里找出候选人的所有联系方式,还是从一份合同里提取所有涉及的金额和日期ÿ…...
雨课堂运动与健康网课高效学习指南
1. 雨课堂运动与健康网课学习资源整合 第一次接触雨课堂的运动与健康网课时,我和很多同学一样手忙脚乱。平台上的资料分散在各个角落,视频、文档、测试题混在一起,根本不知道从哪里开始。后来摸索出一套资源整理方法,效率直接翻倍…...
Nanbeige 4.1-3B赋能微信小程序:打造智能客服对话机器人
Nanbeige 4.1-3B赋能微信小程序:打造智能客服对话机器人 最近在帮一个做电商的朋友琢磨怎么优化他们的客服系统。他们每天要处理大量重复的咨询,比如“什么时候发货”、“怎么退换货”,人工客服忙得团团转,用户还得排队等。这让我…...
Phi-4-Reasoning-Vision开源模型:Phi-4-reasoning-vision-15B双卡推理镜像详解
Phi-4-Reasoning-Vision开源模型:Phi-4-reasoning-vision-15B双卡推理镜像详解 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡RTX 4090环境优化设计。这个工具严格遵循官方SYSTE…...
MySQL局域网远程连接测试教程
MySQL局域网远程连接测试教程1本地服务器安装MySQL服务器,安装MySQL shell, Workbench(非必须)防火墙配置2远程访问用户电脑配置IP配置安装 Workbench客户端1本地服务器 安装MySQL服务器,安装MySQL shell, Workbench(非必须) 点击右下角的Advanced Opt…...
3步实现!本地化语音转文字工具TMSpeech全场景应用指南
3步实现!本地化语音转文字工具TMSpeech全场景应用指南 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 在数字化办公与内容创作领域,如何在保护隐私的前提下实现高效语音转文字?TM…...
MaterialSkin 2:WinForms应用的Material Design现代化解决方案
MaterialSkin 2:WinForms应用的Material Design现代化解决方案 【免费下载链接】MaterialSkin 项目地址: https://gitcode.com/gh_mirrors/mat/MaterialSkin 在传统Windows Forms应用程序面临界面陈旧、用户体验落后的挑战下,WinForms现代化改造…...
