当前位置: 首页 > news >正文

小谈设计模式(4)—单一职责原则

小谈设计模式(4)—单一职责原则

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 单一职责原则
    • 核心思想
      • 职责的划分
      • 单一变化原则
      • 高内聚性
      • 低耦合性
      • 核心总结
    • 举例
      • 图书类(Book)
      • 用户类(User)
      • 图书管理类(Library)
      • 分析
    • 不遵守单一职责原则,可能引发的问题
      • 类的职责不清晰
      • 类的修改影响范围过大
      • 难以重用和扩展
    • Java代码实现
      • 程序分析
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

单一职责原则

单一职责原则(Single Responsibility Principle,SRP)是设计模式中的一项原则,它指出一个类或模块应该有且只有一个引起它变化的原因。换句话说,一个类或模块应该只负责一项职责。

核心思想

职责的划分

将系统中的功能和行为划分为不同的职责,每个类或模块只负责一种相关的职责。这样可以使得类的职责更加明确和清晰,便于理解和维护。

单一变化原则

一个类或模块应该只有一个引起它变化的原因。如果一个类负责多种不相关的职责,那么对其中一个职责的修改可能会影响到其他职责,增加了代码的风险和复杂性。

高内聚性

类的内聚性指的是类内部的成员之间联系的紧密程度。遵守单一职责原则可以提高类的内聚性,使得类内部的成员相互关联度高,功能相关的代码放在同一个类中,便于理解和维护。

低耦合性

类之间的耦合性指的是彼此之间的依赖程度。遵守单一职责原则可以降低类之间的耦合性,使得类之间的依赖关系更加清晰和简单,减少代码的依赖和影响范围。

核心总结

单一职责原则的核心思想是将一个类或模块的职责限定在一个很小的范围内,使其只负责一种相关的功能或行为。这样可以保持类的高内聚性、低耦合性,提高代码的可读性、可维护性和可扩展性。
在这里插入图片描述

举例

假设我们有一个图书管理系统,其中包含了图书的借阅和归还功能。我们可以将这个系统划分为以下几个类:

图书类(Book)

负责表示图书的属性和行为,比如书名、作者、借阅状态等。

用户类(User)

负责表示用户的属性和行为,比如用户名、密码、借阅图书等。

图书管理类(Library)

负责管理图书的借阅和归还功能。
在这里插入图片描述

分析

在这个例子中,每个类都只负责一种相关的职责,符合了单一职责原则。图书类只负责表示图书的属性和行为,用户类只负责表示用户的属性和行为,图书管理类只负责管理图书的借阅和归还功能。

不遵守单一职责原则,可能引发的问题

类的职责不清晰

一个类负责了多种不相关的职责,使得代码难以理解和维护。

类的修改影响范围过大

当一个类负责多种职责时,对其中一个职责的修改可能会影响到其他职责,增加了代码的风险和复杂性。

难以重用和扩展

一个类负责多种职责时,可能会导致代码的耦合性增加,使得难以重用和扩展。
在这里插入图片描述

Java代码实现

// 图书类
class Book {private String title;private String author;private int pageCount;// 构造函数、getter和setter方法省略// 图书的展示功能public void display() {System.out.println("Title: " + this.title);System.out.println("Author: " + this.author);System.out.println("Page Count: " + this.pageCount);}
}// 图书管理类
class Library {private List<Book> books;// 构造函数、getter和setter方法省略// 图书的借阅功能public void borrowBook(Book book) {if (books.contains(book)) {books.remove(book);System.out.println("Borrowed book: " + book.getTitle());} else {System.out.println("Book not available for borrowing.");}}// 图书的归还功能public void returnBook(Book book) {books.add(book);System.out.println("Returned book: " + book.getTitle());}
}

在这里插入图片描述

程序分析

我们定义了两个类:Book和Library。Book类负责表示图书的属性和行为,包括展示图书的功能;Library类负责管理图书的借阅和归还功能。

通过将图书的展示功能和图书的借阅、归还功能分别放在不同的类中,我们遵守了单一职责原则。每个类只负责一种相关的职责,使得代码更加清晰和易于维护。

当我们需要使用这些功能时,可以直接调用相应的方法

Book book = new Book("Design Patterns", "Gang of Four", 400);
book.display();Library library = new Library();
library.borrowBook(book);
library.returnBook(book);

这样,我们可以很方便地使用图书的展示、借阅和归还功能,而不会影响到其他相关的功能。

总结

总结来说,单一职责原则是设计模式中的一项重要原则,它要求将功能划分得更加细致,使得每个类或模块
只负责一种相关的职责。遵守单一职责原则可以提高代码的可读性、可维护性和可扩展性。

相关文章:

小谈设计模式(4)—单一职责原则

小谈设计模式&#xff08;4&#xff09;—单一职责原则 专栏介绍专栏地址专栏介绍 单一职责原则核心思想职责的划分单一变化原则高内聚性低耦合性核心总结 举例图书类&#xff08;Book&#xff09;用户类&#xff08;User&#xff09;图书管理类&#xff08;Library&#xff09…...

ATF(TF-A) EL3 SPMC威胁模型-安全检测与评估

安全之安全(security)博客目录导读 ATF(TF-A) 威胁模型汇总 目录 一、简介 二、评估目标 1、数据流图 三、威胁分析 1、信任边界 2、资产 3、威胁代理 4、威胁类型 5、威胁评估 5.1 端点在直接请求/响应调用中模拟发送方FF-A ID 5.2 端点在直接请求/响应调用中模拟…...

AI绘画Stable Diffusion原理之扩散模型DDPM

前言 传送门&#xff1a; stable diffusion&#xff1a;Git&#xff5c;论文 stable-diffusion-webui&#xff1a;Git Google Colab Notebook部署stable-diffusion-webui&#xff1a;Git kaggle Notebook部署stable-diffusion-webui&#xff1a;Git AI绘画&#xff0c;输入一段…...

NSS [西湖论剑 2022]real_ez_node

NSS [西湖论剑 2022]real_ez_node 考点&#xff1a;ejs原型链污染、NodeJS 中 Unicode 字符损坏导致的 HTTP 拆分攻击。 开题。 附件start.sh。flag位置在根目录下/flag.txt app.js(这个没多大用) var createError require(http-errors); var express require(express); v…...

MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、字符…...

GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通

文章目录 前言一、关于数据仓库需求场景分类二、数据仓库线下部署场景2.1、线下部署场景介绍及优劣势说明2.2、线下部署场景对应的客户需求 三、数据仓库公有云部署场景3.1、公有云部署场景介绍及优劣势说明3.2、公有云部署场景对应的客户需求 四、为何重视数据共享&#xff08…...

Navicat历史版本下载及地址组成分析

下载地址组成 https://download3.navicat.com/download/navicat161_premium_cs_x64.exe 地址逻辑&#xff1a;前缀 版本 类型 语言 位数 前缀: http://download.navicat.com/download/navicat版本: 三位数&#xff0c;前两位是大版本&#xff0c;后一位是小版本&#xff…...

avue之动态切换表格样式问题

动态切换 a\b 两个表格 &#xff0c;a表格高度变成b的高度等问题&#xff0c; 解决方案&#xff1a;...

彻底解决ruoyi分页后总数错误的问题

问题描述 最近时不时的发现用户列表出来的数据只有24条&#xff0c;但是总记录数却有58条&#xff0c;很奇怪。各种百度查询&#xff0c;都是什么修改查询分页改代码&#xff0c;尝试后发现还是没有效果&#xff0c;经过各种验证发现就是SQL语句错误。 如果非要说是SQL语句没…...

SpringMVC学习笔记——1

SpringMVC学习笔记——1 一、SpringMVC简介1.1、SpringMVC概述1.2、SpringMVC快速入门1.3、Controller中访问容器中的Bean1.4、SpringMVC关键组件的浅析 二、SpringMVC的请求处理2.1、请求映射路径配置2.2、请求数据的接收2.2.1、键值对方式接收数据2.2.2、封装JavaBean数据2.2…...

20230908_python练习_selenium模块爬取网页小说练习

霍比特人小说爬取&#xff0c;使用 selenium 模块调用谷歌浏览器&#xff0c;无界面模式爬取小说网站信息&#xff0c;将数据按照每次2000字符在mysql中保存。 # https://www.shukuai9.com/b/324694/ # 导入需要的库 from selenium import webdriver # 导入Keys模块&#xff…...

Python:安装Flask web框架hello world示例

安装easy_install pip install distribute 安装pip easy_install pip 安装 virtualenv pip install virtualenv 激活Flask pip install Flask 创建web页面demo.py from flask import Flask app Flask(__name__)app.route(/) def hello_world():return Hello World! 2023if _…...

深度解析NLP文本摘要技术:定义、应用与PyTorch实战

目录 1. 概述1.1 什么是文本摘要&#xff1f;1.2 为什么需要文本摘要&#xff1f; 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 多文档摘要3.3 信息性摘要 vs. 背景摘要3.4 实时摘要 4. 主要类型4.1 抽取…...

zabbix监控多实例redis

Zabbix监控多实例Redis 软件名称软件版本Zabbix Server6.0.17Zabbix Agent5.4.1Redis6.2.10 Zabbix客户端配置 编辑自动发现脚本 vim /usr/local/zabbix/scripts/redis_discovery.sh #!/bin/bash #Fucation:redis low-level discovery #Script_name redis_discovery.sh red…...

win11将visual studio 2022的调试控制台改为windows terminal

一、前言 默认的调试控制台太丑了&#xff0c;字体也没有好看的&#xff0c;还是更喜欢windows terminal 二、修改 2.1 修改之前 2.2 修改步骤 打开windows terminal点这个向下的标志 选择settings按照下图1, 2, 3步骤依次操作即可 2.3 修改之后 总结 漂亮很多了...

社区问答精选——长安链开发知多少?(8月)

本文是根据社群内开发者较为关注的问题进行整理&#xff0c;希望可以帮助开发者解决所遇到的问题。有更多问答在社区issue中描述更为细致&#xff0c;开发者提问前可以先按照关键词进行搜索。欢迎各位开发者按照问答template提交issue&#xff0c;也欢迎有意愿的开发者参与到社…...

神经网络-Unet网络

文章目录 前言1.seq2seq 编码后解码2. 网络结构3.特征融合4. 前言 Unet用来做小目标语义分割。 优点&#xff1a;网络结构非常简单。 大纲目录 2016年特别火&#xff0c;在细胞领域做分割特别好。 1.seq2seq 编码后解码 2. 网络结构 几个卷积层&#xff0c;越来越扁&#x…...

Java | 多线程综合练习

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;前言&#x1f334;一、卖电影票1.题目2.分析3.代码 &#x1f334;二、送礼物1. 题目2. 分析3.代码 &#x1f334;三.打印奇数1. 题目2.…...

Kotlin变量与控制条件的基本用法

一、变量与控制条件 1、var与val var&#xff1a;可修改变量 val&#xff1a;只读变量&#xff0c;只读变量并非绝对只读。 编译时常量只能在函数之外定义&#xff0c;因为函数内常量是在运行时赋值&#xff0c;编译时常量要在变量赋值前存在。并且值是无法修改的。 const…...

第18章_瑞萨MCU零基础入门系列教程之GPT

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...