设计模式六大原则之:单一职责原则

news2024/9/24 7:22:35

1. 单一职责简介

设计模式中的单一职责原则(‌Single Responsibility Principle, SRP)‌是面向对象设计中的一个基本原则,‌它强调一个类应该仅有一个引起它变化的原因。‌换句话说,‌一个类应该负责一组相对独立且紧密相关的职责,‌并且当这个类需要变更时,‌变更的原因应该只有一个。‌

单一职责原则”是开发生命周期中一个非常重要的原则,它旨在指导开发者如何组织代码,使得每个模块、类或函数都只负责一项特定的任务或职责。

2. 单一职责核心思想

SRP的核心思想(基本理念)是,一个对象应该只关注一件事,即它的责任仅限于执行一个明确的业务功能。这个原则由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Code》中首次明确提出,其目的是提高代码的可读性、可维护性和模块间的独立性。当一个类承担了过多的功能,例如处理输入、计算结果、输出结果等混合在一起时,会变得难以理解和修改。这样的设计不利于团队协作,也容易引发错误。

主要特性如下:

2.1 职责分离

将不同的职责分离到不同的类或模块中,‌有助于降低系统的复杂性,‌提高系统的可维护性。‌

2.2 高内聚低耦合

遵循单一职责原则的类通常具有较高的内聚性(‌即类的内部元素之间联系紧密)‌和较低的耦合性(‌即类与类之间的依赖关系简单)‌。‌

2.3 易于扩展

当系统需要增加新功能时,‌可以更容易地通过添加新的类来实现,‌而不是修改现有的类。‌

3. 单一职责应用场景

遵循单一职责原则有助于创建更具弹性的系统,它的应用场景主要体现在如下几个方面:

3.1 职责识别

首先,‌需要仔细分析类的职责,‌确保每个类都只有一个明确的职责。‌如果发现一个类承担了多个职责,‌那么应该考虑将这些职责分离到不同的类中。‌

3.2 重构代码

在识别出类的多个职责后,‌可以通过重构代码来将这些职责分离。‌这通常涉及到将类拆分成多个更小的类,‌每个类都负责一个单一的职责。‌

3.3 接口隔离

单一职责原则也适用于接口设计。‌一个接口应该只包含一组紧密相关的方法,‌而不应该包含与接口主要目的无关的方法。‌这有助于保持接口的简洁和清晰。‌

4. 单一职责使用步骤

  1. 清晰定义类边界:确定一个类应该包含哪些行为,以及应该对外提供什么样的接口。理想情况下,这个接口应该是最小化的,只包含完成其职责所需的操作。

  2. 将复杂功能拆分:如果某个功能过于庞大,考虑将其分解为几个更小、更专注的函数或类。这可以提高代码的复用性,并使其更容易测试。

  3. 避免过度继承:过多的继承可能导致类变得臃肿,难以理解。除非有明确的继承关系和共享行为,否则通常建议选择组合而非继承。

  4. 尽量使用接口和抽象类:它们可以帮助封装职责并提供统一的行为规范,让具体的实现细节隐藏起来。

  5. 遵循高内聚低耦合原则:一个类内部应该高度关联,对外则尽可能地松散耦合。这样可以确保当其中一个部分改变时,不会对其他部分造成大的影响。

  6. 定期审查代码:定期评估类的职责是否仍然清晰,是否有需要重构的地方。如果发现某类职责范围过大,可能是时候拆分成两个或更多的类了。

5. 单一职责代码示例

现在假设我们有一个类Vehicle,它负责汽车的行驶和停车功能。如果汽车行驶逻辑发生变化,或者停车逻辑发生变化,那么Vehicle类就会受到影响,这违反了单一职责原则。解决这个问题的方法是将行驶和停车功能分离到不同的类中,例如DriveControllerParkingSystem

5.1 违反单一职责的代码设计Vehicle

// 违反单一职责的设计
class Vehicle
{
    public void drive() {
        // 实现行驶逻辑
    }

    public void park() {
        // 实现停车逻辑
    }
}

5.2 用单一职责思想拆分Vehicle

// 行驶控制器
class DriveController {
    public void drive() {
        // 实现行驶逻辑
    }
}
 
// 停车系统
class ParkingSystem {
    public void park() {
        // 实现停车逻辑
    }
}
 
// 使用示例
public class SingleResponsibilityPrincipleExample {
    public static void main(String[] args) {
        DriveController driveController = new DriveController();
        driveController.drive();
 
        ParkingSystem parkingSystem = new ParkingSystem();
        parkingSystem.park();
    }
}

在这个例子中,DriveController类只负责汽车的行驶功能,而ParkingSystem类只负责汽车的停车功能。这样一来,如果行驶逻辑或停车逻辑发生变化,只需修改对应的类即可,不会影响其他部分的代码。这就是单一职责原则的应用。

6. 总结

综上所述,单一职责原则(Single Responsibility Principle, SRP) 是面向对象设计中的一个基本原则,它提倡一个类或者一个模块应当只有一个引起它变化的原因。简单来说,就是每个类应负责一个明确的任务,并且这个任务只有一个原因导致其改变。以下是这个原则的一些关键点:

  1. 定义清晰: 类应有明确且具体的职责,使其能完成单一目标,比如管理数据库连接,或者处理用户请求。

  2. 高内聚: 类内的所有方法应该密切相关的服务于同一项功能,彼此之间相互独立,互不影响。

  3. 低耦合: 类之间的依赖程度尽量低,这样当一个类需要更改时,不会波及到其他无关的类,提高了代码的稳定性。

  4. 避免过多功能: 避免在一个类中包含过多的特性或行为,每个类都应该有自己的专业领域,减少复杂性。

  5. 可扩展性: 当需求变化时,由于职责明确,只需修改负责那部分职责的部分即可,不需要牵涉全局。

  6. 易于测试: 因为职责集中,单个类的单元测试相对简单,有利于测试驱动开发(TDD)。

  7. 利于重构: 单一职责有助于识别并孤立出可以独立调整的代码块,使得重构变得更简单。

遵循单一职责原则有助于编写出易于理解、稳定和可维护的代码。然而,也要注意过犹不及,适度的职责划分才能保持设计的平衡。

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

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

相关文章

VisionPro二次开发学习笔记13-使用CogToolBlock进行图像交互

该程序演示了如何使用CogToolBlock进行图像交互. 从vpp文件中加载一个ToolBlock。 用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。 用户还可以从coins.idb或采集FIFO中选择图像。 “运行一次”按钮执行以下操作: 获取下一个图像或读取下一…

数学建模学习笔记

数学建模学习笔记 现学现卖,随缘更新QwQ 主要根据b站大师兄的视频整理而成,有不懂的可以去看原视频 List 数学建模学习笔记一、 层次分析法1.1 矩阵的一致性及其检验1.2 权重计算1.3 具体流程 二、模糊综合评测2.1 隶属函数2.2 隶属函数的确定方法2.3 模…

项目管理中的关键节点——里程碑

里程碑作为项目管理过程中的关键节点,它不仅为项目团队提供了清晰的方向和阶段性目标,还确保了项目能够按照既定的路线稳步前进。 里程碑是项目进程中,那些标志着项目阶段完成或关键决策点的重大事件或时间点。与日常任务或活动不同&#x…

图论(强联通分量)

在图论中,特别是在讨论有向图(Directed Graph)时,我们常常需要了解图的结构特性,比如强联通分量(Strongly Connected Components, SCC)。了解强联通分量中的各种边对于理解图的整体结构以及某些…

iPhone官方商店软件下载---免费看各种剧第④弹【iOS版包括iPad】

①点击iPhone自带软件App Store ②点击搜索,输入“模数转换器” ,点击下载到手机 ③进入软件页面后,我们需要激活页面,点击“setting”,再点击“feedback” ④在反馈界面输入“小饼干”,点击“Summit”&a…

springboot,mysql多数据源-mybaits

为啥要多数据源,因为我现在有个需求,需要将A库的查询结果,写入到B库。 但是原来的springboot里面就只有A库,所以现在要加上B库。 1.修改application.yaml的数据库连接 这个是原来的 现在改成 其实就是将datasource:xxx&#xff…

微型家庭中控STM32+C#上位机_(STM32部分)

今日尝试开发一款简单好学的 C8T6C#_Winform上位机 的微型家庭中控设备的 小试验品: 这个设备将成为我毕设系统的一个小部分...... 主要开发环境与工具介绍: 单片机 STM32F103C8T6 使用标准库函数编程 Visual Studio 2022软件 C# Winform 开发 上位机…

【相机与图像】2. 相机内外参的标定的代码示例

1 摄像头内参的标定 【相机标定具体操作】 使用将要标定的摄像头,以不同的角度采集棋盘格,要保证视野内出现完整的棋盘格。采集图片数量约15张左右即可。 以11*8的棋盘格为例,具体流程如下: step 1. 设置棋盘格3D点;通…

MapReduce_Writable序列化

使用序列化封装对象 将输入的csv按照员工号拆分成每个员工&#xff0c;每个员工存储为员工对象 数据处理过程 employee_noheader.csv 1,ZhangSan,101,5000 2,LiSi,102,6000 3,WangWu,101,5500 4,ZhaoLiu,103,7000 5,SunQi,102,6500pom.xml <?xml version"1.0&qu…

ctfshow-web入门-sql注入(web201-web205)系统练习sqlmap的使用

目录 1、web201 2、web202 3、web203 4、web204 5、web205 开始系统练习sqlmap的使用 1、web201 随便提交一个看下它调用的接口和请求的参数有哪些 可以看到 URL 为&#xff1a; https://32c7d026-d195-4074-a0f9-492c17dc1a2c.challenge.ctf.show/api/?id1&page1&…

微信答题小程序产品研发-前端开发

开发一款答题小程序界面&#xff0c;涉及到的技术栈&#xff0c;主要包括微信小程序的WXML、WXSS、JavaScript等。 由于时间有限&#xff0c;我先大致记录一下各个功能模块的基本开发概要&#xff0c;后面有空了再详细整理&#xff0c;分享给大家。 1. 首页 &#xff08;1&am…

Windows网络重置后无法连接网络

Windows网络重置后重启电脑无法连接到网络 打开命令提示符快捷键winR输入msconfig点击确定 在系统配置中找到服务先全部禁用&#xff0c;在全部启用&#xff0c;点击应用后重启电脑就可以了

LVS的简单配置及对Mysql主从复制的补充

Day 22 LVS的配置 环境准备 DSN() 用来解析各主机的域名和ip地址&#xff0c;配置域名解析huajuan&#xff0c;负责管理其他主机 web1--->web1.tangpin.huajuan web2--->web2.tangpin.huajuan dns--->dns.tangpin.huajuan web1(192.168.2.200) 用nginx…

解决 MacOS 连接公司 VPN 成功但是不能网络的问题

目录 解决办法2024 Mac mini 爆料 解决办法 操作比较简单&#xff0c;修改配置文件即可&#xff08;如果没有则需要手动创建&#xff09;。 sudo vim /etc/ppp/options在此文件下&#xff0c;加入 plugin L2TP.ppp&#xff1a; plugin L2TP.ppp如果文件里有l2tpnoipsec&…

基于ESP32的智能门锁系统测试

项目介绍 基于ESP32的智能门锁系统。可以运用在商务办公、家用住宅、酒店以及公租房短租公寓等领域。基于esp32的智能门锁系统是生物识别技术和嵌入式系统技术的完美结合&#xff0c;基于ESP32系统进行开发&#xff0c;同时在云端服务器搭建了MQTT服务器并连接开源的家庭自动化…

Apple Intelligence 最詳細解說

Apple Intelligence究竟是什麼&#xff1f; 顧名思義&#xff0c;Apple Intelligence就是Apple獨家開發的 AI 模型&#xff08;深度整合至 iOS 18、iPadOS 18 和 macOS Sequoia&#xff09;&#xff0c;旨在透過理解和生成語言和圖像、解讀上下文&#xff0c;並在特定App中執行…

【计算机网络】UDP实战

其实经过这几天写的几种不同的UDP的简易客户端与服务端&#xff0c;还是很有套路的&#xff0c;起手式都是非常像的。 更多的难点对我来说反而是解耦&#xff0c;各种各样的function一用&#xff0c;回调函数一调&#xff0c;呕吼&#xff0c;就会懵一下。 对于这篇文章&#x…

成功解决7版本的数据库导入 8版本数据库脚本报错问题

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;热爱技术的小郑。回复 Java全套视频教程 或 前端全套视频…

大数据面试SQL(七):累加刚好超过各省GDP40%的地市名称

文章目录 累加刚好超过各省GDP40%的地市名称 一、题目 二、分析 三、SQL实战 四、样例数据参考 累加刚好超过各省GDP40%的地市名称 一、题目 现有各省地级市的gdp数据,求从高到低累加刚好超过各省GDP40%的地市名称&#xff0c;临界地市也需要。 例如&#xff1a; 浙江省…

设计模式-延迟加载(Lazy Load)

概念 一个对象&#xff0c;它虽然不包含所需要的所有数据&#xff0c;但是知道怎么获取这些数据。 加载一个对象会引起大量相关对象的加载&#xff0c;这样会损害系统的性能。延迟加载会暂时终止这个加载过程。 运行机制 四种实现延迟加载的方法&#xff1a; 延迟初始化&am…