首页 > 其他分享 >设计模式六大原则(一)---单一职责原则

设计模式六大原则(一)---单一职责原则

时间:2024-06-22 22:44:52浏览次数:12  
标签:逻辑 职责 原则 代码 public --- 设计模式 单一

单一职责原则(Single Responsibility Principle,SRP)是面向对象设计中的一个原则,它要求一个类或模块应该有且只有一个引起它变化的原因。

单一职责原则主要解决的问题是类的职责过于复杂,即一个类承担了过多的责任。当一个类具有多个职责时,任何一个职责的变化都可能影响到其他职责,导致代码的脆弱性和可维护性下降。

需要使用单一职责原则的时候,通常有以下情况:

  1. 当一个类承担了多个不同的职责时,可以考虑将这些职责分离到不同的类中,以遵循单一职责原则。
  2. 当一个类的职责变得过于庞大复杂时,容易引发代码的混乱和难以维护,可以使用单一职责原则来重新设计和拆分类的职责。

假设你有一个笔记本电脑,它有多个功能:浏览器浏览网页、文本编辑器写作、音乐播放器播放音乐等。如果你把所有这些功能都放在一个类中,那么这个类就承担了太多的职责,一旦其中一个功能需要修改或添加新功能,就会影响到其他功能的稳定性。

相反,如果你将浏览器、文本编辑器和音乐播放器分别作为独立的类来实现,每个类只负责自己的功能,那么当你需要修改或扩展其中一个功能时,不会对其他功能产生影响,代码也更加清晰和易于维护。

单一职责原则的优点包括:

  1. 提高代码的可读性和可维护性,因为每个类都只关注自己的单一职责,代码逻辑更加清晰。
  2. 减少类之间的耦合性,一个类的变化不会影响到其他类。

单一职责原则也有一些缺点:

  1. 类的数量可能会增加,特别是在职责非常细粒度的情况下,可能会导致类的爆炸性增长。
  2. 过度拆分职责可能会导致系统中存在大量的小类,增加了代码的复杂性和维护的困难度。

适合使用单一职责原则的场景包括:

  1. 当一个类承担了多个不同的职责时,可以考虑将这些职责分离到不同的类中,以遵循单一职责原则。
  2. 当一个类的职责变得过于庞大复杂时,容易引发代码的混乱和难以维护,可以使用单一职责原则来重新设计和拆分类的职责。

通过一个简单的代码示例来说明单一职责原则的使用:

// 不符合单一职责原则的类
class Employee {
    public void performTaskA() {
        // 执行任务A的逻辑
    }

    public void performTaskB() {
        // 执行任务B的逻辑
    }

    public void calculateSalary() {
        // 计算工资的逻辑
    }
}

// 符合单一职责原则的类
class Employee {
    public void performTaskA() {
        // 执行任务A的逻辑
    }

    public void performTaskB() {
        // 执行任务B的逻辑
    }
}

class PayrollSystem {
    public voidcalculateSalary(Employee employee) {
        // 计算工资的逻辑
    }
}

在上面的示例中,原始的Employee类违反了单一职责原则,因为它既负责执行任务A和任务B,又负责计算工资。

为了符合单一职责原则,我们将任务A和任务B的逻辑分离到Employee类中,而将计算工资的逻辑放在一个新的PayrollSystem类中。

这样一来,当需要修改任务A或任务B的逻辑时,不会影响到计算工资的功能,也使得代码更加清晰和易于维护。

这个示例展示了单一职责原则如何帮助我们将功能职责分离,提高代码的可读性、可维护性和扩展性。

标签:逻辑,职责,原则,代码,public,---,设计模式,单一
From: https://www.cnblogs.com/xiaoyuV/p/18262818

相关文章

  • 杂谈:(2024-6)阿里云的域名价格,及续费价格。看看哪种最合算。
     2024-6-22,记录此时的阿里云域名价格,及续费价格。看看哪种最合算。https://wanwang.aliyun.com/domain/上图中:黄色的是价格不错的。蓝色的是相对还行的。橙色标记的是热门域名。所以,结论是:1年期域名,.xyz、 .site、  .fun、 .website、  .grou、  .live、 ......
  • SElinux内核态的实现-avc、avd的设计篇
    文章目录avc_has_perm的处理逻辑[部分]av_decision访问向量决策的设计allowed、auditallow、auditdenyseqnoflagsavc_has_perm_noaudit检查点函数函数原型参数解释函数逻辑selinux检查结果缓存AVC的设计与实现structselinux_avcstructavc_cacheavc的初始化avc_s......
  • jmeter中beanshell-regex用法-prev.getTime()
    jmeter-beanshellPostprocessor,实现需求:判断响应时间大于10ms的响应,并记录想要的响应字段,比如流水号,注册的用户名密码等代码如下:importjava.util.regex.Matcher;importjava.util.regex.Pattern;//这里引入判断响应时间的代码,如判断响应时间超过10ms,则记录流水号longresp......
  • anaconda安装①tensorflow-cpu 1.12.0py3.6②tensorflow-gpu 2.4.0③pytorch 2.4.1 通
    本机环境:Win10、rtx4060tianaconda常用命令condaenvlist#查看已有环境名称condaenvlistcondaactivateenv_name #激活环境condaactivateenv_namecondadeactivateenv_name#退出环境condadeactivateenv_namecondacreate-nenv_namepython=3.x#创建p......
  • 20240622-PowerShell5和PowerShell7在windows terminal中无法切换
    今天安装powertoys小工具commandNotFound的时候,提示要求powershell版本是7,而当前powershell版本是5,如下。但是powertoys中显示powershell7已经安装,如下图。主要问题在于powershell5的程序名是powershell.exe,而powershell7的程序名是pwsh.exe.windowsterminal每个选项卡默......
  • java设计模式--装饰器模式
    装饰器模式是一种结构型设计模式,它允许你动态地向对象添加额外的行为。装饰器模式通过将对象包装在一个装饰器类中,以提供额外的功能,而不是修改原始对象的结构。装饰器模式主要解决的问题是在不改变现有对象结构的情况下,动态地添加功能或修改行为。它可以避免使用子类继承的方式引......
  • go - Monitoring
    保证高可用的方法1.日志2.链路追踪3.监控 1.业务监控(领导层) OPS/DAU/访问状态httpcode/业务接口(登陆注册聊天上传留言搜索) 2.systemmonitoring (运维) operatingsystem:cpu/memory/diskusage/diskspace/TCP(上w的连接),流量 组件:mysql,redis,kafka 3.......
  • Web网页端IM产品RainbowChat-Web的v7.0版已发布
    一、关于RainbowChat-WebRainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统)。► 详细介绍:http://www.52im.net/thread-2483-1-1.html► 版本记录:http://www.52im.net/th......
  • 【C#进阶】多线程和异步编程_2024-06-22
    关于多线程和异步编程简单来说,就是多线程并行执行任务提速,异步编程等待不浪费资源,并发集合确保数据访问安全,三者合力提升程序效率与反应能力。1.理解线程想象一下,你在厨房做饭,同时需要洗菜、切菜、炒菜。如果你一个人来做,就需要在这些任务之间来回切换,这很慢。但如果请几个朋友......
  • 【vueUse库Sensors模块各函数简介及使用方法---下篇】
    vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法:vueUse库Sensors模块各函数简介及使用方法vueUseSensors函数1.usePag......