设计模式-单一职责原则
基本介绍
对类来说的,即一个类应该只负责一项职责。如类A负责两个不同的职责,职责1,职责2.当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2
应用实例
方案1
public class SingleResponsibility1 {public static void main(String[] args) {Vehicle vehicle = new Vehicle();vehicle.run("摩托车");vehicle.run("汽车");vehicle.run("飞机");}}// 交通工具类
// 方式1
// 1.在方式1的run方法种,违反了单一职责原则
// 2.解决:根据交通工具运行方法的不同,分解成不同的嘞
class Vehicle {public void run(String vehicle){System.out.println(vehicle + "在公路上运行");}
}
方案2
public class SingleResponsibility2 {public static void main(String[] args) {RoadVehicle roadVehicle = new RoadVehicle();roadVehicle.run("摩托车");roadVehicle.run("汽车");AirVehicle airVehicle = new AirVehicle();airVehicle.run("飞机");}}// 方案2
// 1.遵守了单一职责原则
// 2.但是这样做的改动很大,即将类分解,同时修改客户端
// 3.改进:直接修改Vehicle,改动代码比较少=>3
class RoadVehicle{public void run(String vehicle){System.out.println(vehicle + "在公路上运行");}
}class AirVehicle{public void run(String vehicle){System.out.println(vehicle + "在天上上运行");}
}class WaterVehicle{public void run(String vehicle){System.out.println(vehicle + "在水中上运行");}
}
方案3
/*** @author zhupanlin* @version 1.0* @description: TODO* @date 2024/4/9 9:46*/
public class SingleResponsibility3 {public static void main(String[] args) {Vehicle2 vehicle2 = new Vehicle2();vehicle2.run("汽车");vehicle2.runAir("飞机");vehicle2.runWater("轮船");}}// 方式3
// 1.这种修改方法没有对原来的类做大修改,只是增加了方法
// 2.这里虽然没有在类级别上遵守单一职责原则,但是在方法级别上遵守单一职责原则
class Vehicle2 {public void run(String vehicle){System.out.println(vehicle + "在公路上运行");}public void runAir(String vehicle){System.out.println(vehicle + "在天上上运行");}public void runWater(String vehicle){System.out.println(vehicle + "在水中上运行");}
}
单一职责原则注意事项和细节:
- 降低类的复杂度,一个类只负责一项职责。
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 通常情况下,我们应当遵守单一职责原则, 只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则.
相关文章:
设计模式-单一职责原则
基本介绍 对类来说的,即一个类应该只负责一项职责。如类A负责两个不同的职责,职责1,职责2.当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2 应用实例 方案1 public cl…...
vue和nunjucks的变量插值的形式{{}}冲突
Nunjucks 中修改配置 const nunjucks require(nunjucks);const template_old nunjucks.renderString(template_old: Hello, {{name}}!, { name: World }); console.log(template_old); // 配置 Nunjucks 环境 nunjucks.configure({tags: {variableStart: $(, // 设置变量起始…...
多语言婚恋交友APP开发流程一览
近年来,随着全球化的发展和人们对跨文化交流的需求增加,多语言婚恋交友APP的需求逐渐增长。开发这类APP需要考虑到不同语言和文化下用户的需求,涉及到一系列独特的流程和挑战。本文将从专家角度为您解析多语言婚恋交友APP的开发流程ÿ…...
RUM 最佳实践-交互延迟的探索与发现
FID 在互联网高速发展的时代,用户体验已成为企业竞争的关键所在。网页性能作为用户体验的重要组成部分,直接影响着用户的满意度和工作效率。First Input Delay(FID)作为衡量网页性能的重要指标,越来越受到业界关注。今…...
spring boot 集成 flyway依赖 做数据库迁移,让部署没烦恼
flyway 是一个敏捷工具,用于数据库的移植。采用 Java 开发,支持所有兼容 JDBC 的数据库。 主要用于在你的应用版本不断升级的同时,升级你的数据库结构和里面的数据。 还是直接上代码 第一步: <!-- Flyway 数据库迁移 依赖 他…...
TCP协议--传输机制
TCP协议原理 TCP协议是对数据传输提供的一个管控机制,主要体现在可靠和效率两个方面,即在保证数据可靠传输的情况下尽可能的提高效率 可靠传输机制 确认应答机制 向对方发送一个数据报,对方要返回一个确认应答的数据报 实现的方式&#x…...
句柄ros::NodeHandle nh(“~“)与nh对launch文件参数配置(param)的影响
ros::NodeHandle nh("~"); 改为: ros::NodeHandle nh; 即可 /*************************分割线 ************************/ 如果原本是: ros::NodeHandle nh;可以改成: ros::NodeHandle nh("~"); 试试...
C++_List的学习
1.概述 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 2. list 的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素 3. list…...
centos 7.9 nginx本地化安装,把镜像改成阿里云
1.把centos7.9系统切换到阿里云的镜像源 1.1.先备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2.下载新的CentOS-Base.repo配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo特别…...
JVM规范中的运行时数据区
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏:…...
Stable Diffusion文生图技术详解:从零基础到掌握CLIP模型、Unet训练和采样器迭代
文章目录 概要Stable Diffusion 底层结构与原理文本编码器(Text Encoder)图片生成器(Image Generator) 那扩散过程发生了什么?stable diffusion 总体架构主要模块分析Unet 网络采样器迭代CLIP 模型 小结 概要 Stable …...
SDK-0.7.8-Release-实体管理 - ApiHug-Release
🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 更多精彩…...
3. DAX 时间函数-- DATE 日期--一生二,二生三,三生万物
在数据分析过程中,经常需要从一个数据推到另外一个数据,日期数据也是如此,需要从一个日期推到另外一个相关的日期,或者从一群日期推到另外一个相关的日期/一群相关的日期。这一期说的就是日期之间彼此推衍的函数,会比之…...
c 解数独(通用方法,适用于9×9 数独)
折腾了一周时间,终于搞定99数独通用方法 思路:1.生成每行空位的值,也就是1-9中除去非0的数。 2.用行,列,宫判断每行中每个空位的最小取值范围后再重新生成每行。 3.随机提取生成的9行,判断每列之和是否等…...
一篇文章深入学习Java的AQS(AbstractQueuedSynchronizer)
深入理解AQS的设计和工作机制 Oracle官方文档中的AbstractQueuedSynchronizer部分讲解 AbstractQueuedSynchronizer(简称AQS)是Java并发包中的一个基础框架,它为实现依赖单个原子变量来表示状态的同步器提供了可靠的基础。这个框架被广泛用…...
Linux sed
文章目录 1. 基本功能2.sed替换ssed配合grep和管道操作符的例子 3.sed中的删除和添加3.1 d删除3.2 a i添加添加多行 4.sed行替换替换包含某字符的行 5.单字符替换 y6. p打印命令打印含有目标字符的行sed中包含多个指令,使用{} 7.sed w 写入文件8.sed r 读取文件9.se…...
【MySQL】MySQL在Centos 7环境安装
目录 准备工作 第一步:卸载不要的环境 第二步:下载官方的mysql 第三步 上传到Linux中 第四步 安装 正式安装 启动 编辑 登录 准备工作 第一步:卸载不要的环境 使用root进行安装 如果是普通用户,使用 su - 命令&#…...
【CSS】一篇文章讲清楚screen、window和html元素的位置:top、left、width、height
一个Web网页从内到外的顺序是: 元素div,ul,table... → 页面body → 浏览器window → 屏幕screen 分类详情屏幕screen srceen.width - 屏幕的宽度 screen.height - 屏幕的高度(屏幕未缩放时,表示屏幕分辨率) screen.availLeft …...
铸造大型基础平板的结构应该怎样设计
设计大型基础平板的结构时,需要考虑以下几个方面: 地质条件:首先要了解工程所在地的地质条件,包括土质、地下水位、地震状况等。根据地质条件来选择合适的基础类型,如浅基、深基或地下连续墙等。 荷载分析:…...
医院预约系统微信小程序APP前后端
医院预约系统具体功能介绍:展示信息、可以注册和登录, 预约(包含各个科室的预约,可以预约每个各个医生),就诊引导包含预约的具体信息,包含就诊时间、就诊科室、就诊医生以及就诊人信息、和支付状…...
OpenCV实战:用Python+SIFT+八点算法搞定双目视觉匹配(附完整代码)
OpenCV实战:PythonSIFT八点算法实现双目视觉精准匹配 在计算机视觉领域,立体匹配是一个经典而富有挑战性的问题。想象一下,当你用双眼观察世界时,大脑能自动计算出物体的距离——这正是双目视觉系统要模拟的过程。本文将带你用Pyt…...
UG/NX二次开发必备:C#和C++项目DLL自动签名与拷贝全攻略(附避坑指南)
UG/NX二次开发实战:C#与C项目DLL签名与部署全流程解析 在工业设计软件领域,Siemens NX(原Unigraphics)的二次开发能力一直是工程师扩展功能、提升效率的重要途径。而DLL文件的数字签名环节,则是确保开发成果能在正版NX…...
Clawdbot网关配置教程:实现Qwen3-VL:30B与飞书的无缝对接
Clawdbot网关配置教程:实现Qwen3-VL:30B与飞书的无缝对接 1. 准备工作与环境概述 在开始配置前,请确保已完成以下准备工作: 已在CSDN星图AI云平台完成Qwen3-VL:30B的私有化部署(参考上篇教程)拥有飞书开放平台的企业…...
FRCRN模型结构解析:频域卷积+循环网络如何协同提升信噪比
FRCRN模型结构解析:频域卷积循环网络如何协同提升信噪比 1. 引言:语音降噪的挑战与突破 语音降噪技术一直面临着"既要又要"的难题:既要彻底消除背景噪声,又要完整保留人声细节。传统的降噪方法往往在这两者之间难以平…...
保姆级教程:用seqtk、bwa和bedtools从零绘制GC-depth图,诊断测序污染
从零构建GC-depth分析全流程:手把手教你诊断测序数据污染 刚拿到测序数据的生物信息学新手,常常会面临一个灵魂拷问:我的数据干净吗?GC-depth分析就像给测序数据做"体检",通过一张图就能快速发现细菌污染、样…...
【FastAPI 2.0流式AI响应核心机密】:3大异步协程调度陷阱、2处EventSource底层劫持点、1个未公开的StreamingResponse状态机设计缺陷
第一章:FastAPI 2.0流式AI响应的架构演进与设计哲学FastAPI 2.0 将流式响应能力从实验性支持提升为核心原语,其底层重构了 Starlette 的响应生命周期与事件循环集成机制,使 Server-Sent Events(SSE)、text/event-strea…...
基于springboot的某学院勤工俭学岗位兼职平台设计与实现
目录 技术选型与架构设计核心功能模块划分数据库设计要点关键代码实现示例安全与权限控制测试与部署计划扩展性考虑 项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术选型与架构设计 后端采用SpringBoot框架,集…...
ThreadLocal 源码分析与内存泄漏问题
前言 ThreadLocal 是 Java 中实现线程局部变量的重要工具,被广泛应用于事务管理、链路追踪、用户上下文等场景。然而,面试中关于 ThreadLocal 的追问往往直指其底层设计和内存泄漏问题。 本文将深入分析 ThreadLocal 的源码实现,揭示内存泄…...
【独家逆向分析】:2026年Python官方AOT预编译包(.so/.dylib/.dll)签名验证失败报错的底层机制——绕过签名强制校验的合规临时方案
第一章:Python原生AOT编译方案2026报错解决方法总览Python原生AOT(Ahead-of-Time)编译在2026年生态中已进入稳定试用阶段,但开发者常遭遇如 ModuleNotFoundError: No module named _aot_runtime、Unsupported AST node: Match 或 …...
USB设备安全弹出工具终极指南:告别Windows繁琐移除,一键搞定所有存储设备
USB设备安全弹出工具终极指南:告别Windows繁琐移除,一键搞定所有存储设备 【免费下载链接】USB-Disk-Ejector A program that allows you to quickly remove drives in Windows. It can eject USB disks, Firewire disks and memory cards. It is a quic…...
