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

news2024/11/25 4:22:18

单一职责原则

  • 一 官方定义
    • 基本介绍
  • 二 案例演示
    • 普通方式实现
      • 解决方案
    • 解决方案一
      • 解决方案
      • 案例分析
    • 解决方案二
      • 解决方案
      • 案例分析
    • 案例总结
  • 三 注意事项&细节
  • 四 如何遵守单一职责原则?

一 官方定义

单一职责原则(Single Responsibility Principle, SRP),有且仅有一个原因引起类的变更

顾名思义:一个类只负责一项职责

基本介绍

即对类来说,一个类应该只负责一项职责。如类 A 负责两个不同职责:职责 1,职责 2,当职责 1 需求变更而改变 A 时,可能造成职责 2 执行错误,所以需要将类 A 的粒度分解为 A1,A2
在这里插入图片描述

二 案例演示

需求:有一个动物类,里面定义一个在森林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作

普通方式实现

解决方案

/**
 * @Description 演示单一职责原则
 */
public class SingleDemo {
    public static void main(String[] args) {
        new Animal().runForest("老虎");
        new Animal().runForest("狮子");
        new Animal().runForest("老鹰");

    }
}

//需求:有一个动物类,里面定义一个在森林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作
class Animal {
    //森林奔跑的方法
    public void runForest(String animal) {
        System.out.println(animal + "在森林里愉快的奔跑");
    }
}

案例分析
在这里插入图片描述
语法上没有任何问题,但是在业务逻辑上有点不符合实际场景。老虎,狮子可以奔跑,老鹰应该是飞翔才对。这个run方法既有森林里奔跑的动物,又有天空中奔跑的动物,不仅违反了业务逻辑,又违反了单一职责。

解决方案一

拆分类,拆分类为更小的粒度

解决方案

  1. 职责分解,将Animal类的职责分解成ForestAnimal类和AirAnimal类
  2. 使用时分开使用对应的类
/**
 * @Description 演示单一职责原则
 */
public class SingleDemo {
    public static void main(String[] args) {
        //方案一
        new ForestAnimal().run("老虎");
        new ForestAnimal().run("狮子");
        new ForestAnimal().run("老狼");
        new AirAnimal().fly("老鹰");
    }
}
//需求:有一个动物类,里面定义一个在森林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作
class ForestAnimal{
    public void run(String animal){
        System.out.println(animal + "在森林里愉快的奔跑");

    }
}
class AirAnimal{
    public void fly(String animal){
        System.out.println(animal + "在天空中愉快的飞翔");

    }
}

案例分析

在这里插入图片描述
优势:符合了业务逻辑,符合单一职责原则
劣势:改动幅度大,不光是要拆分类,客户端的代码也要进行大幅度的改动

解决方案二

直接在原来的类的基础上进行改动

解决方案

/**
 * @Description 演示单一职责原则
 */
public class SingleDemo {
    public static void main(String[] args) {
        new Animal().runForest("老虎");
        new Animal().runForest("狮子");
        new Animal().flyAir("老鹰");
    }
}
//需求:有一个动物类,里面定义一个在森林奔跑的方法,创建动物的实例,调用方法,方法内执行打印操作
class Animal{
    //森林奔跑的方法
    public void runForest(String animal){
        System.out.println(animal + "在森林里愉快的奔跑");

    }
    //天空飞翔的方法
    public void flyAir(String animal){
        System.out.println(animal + "在天空里愉快的飞翔");
    }

}

案例分析

在这里插入图片描述
优势:改动幅度下,包括客户端,完成了业务逻辑
劣势:是否违反单一职责原则? (没有在类级别遵守单一职责,在方法级别的遵守)

案例总结

单一职责原则:各司其职
通过上面两种方案分析:
方案一:类级别遵守了单一职责原则,但是改动的代价很高
方案二:方法级别遵守了单一职责原则,改动幅度较小
综上所述,单一职责原则最核心的什么? 各司其职

三 注意事项&细节

  1. 降低类的复杂度,一个类只负责一项职责

一个类职责少了,相应的复杂度不就低了嘛

  1. 提高类的可读性以及可维护性

相应的复杂度降低了,代码量就会减少,可读性也就提高了,可维护性自然也就提高了

  1. 降低变更引起的风险

一个类职责越多,变更的可能性就会越大,变化带来的风险就会越大

  1. 通常情况下,我们应当遵守类级别单一职责原则

只有逻辑足够简单,才可以在代码中违反单一职责原则

四 如何遵守单一职责原则?

其实就是合理的职责分解
从业务出发,从需求出发,识别出同一个类型的职责
需要说明一点:单一职责原则不是面向对象语言特有的,只要是模块化的程序设计,都要遵守单一职责原则

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

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

相关文章

用Spark写入Mysql的特别注意事项

相信有部分刚入门的小伙伴对于spark写入Mysql的过程不太熟悉。特意写一篇文章讲一下这个注意事项,以免“上大当” 我们先看一个小伙伴写的一段spark写入mysql的代码 public static void trans(SparkSession spark,String pro_table, String pro_url, String pro_dr…

微服务框架 SpringCloud微服务架构 服务异步通讯 52 惰性队列 52.1 消息堆积问题

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯52 惰性队列52.1 消息堆积问题52.1.1 消息堆积问题52 惰性队列 52.1 消息堆积问题 52.1.1 消…

11基于主从博弈理论的共享储能与综合能源微网优化运行研究(MATLAB程序)

参考文献: 基于主从博弈理论的共享储能与综合能源微网优化运行研究——帅轩越(2022电网技术) 主要内容; 代码主要做的是基于主从博弈理论的共享储能与综合能源微网优化运行研究,首先介绍了系统运行框架,分析了系统内…

一文了解各种高精度室内定位技术

在消费需求和创新技术驱动下,可穿戴设备和物联网产品的发展驶入了快车道,GNSS定位功能在无人驾驶、智能设备、资产追踪等日趋智能化中广泛应用,而随着万物互联时代的到临,物联网技术围绕人员、资产的室内位置服务需求也愈加强烈。…

vue使用

目录 路由History模式打包页面空白 项目放根目录 -- 配置 项目放二级目录 -- 配置 路由History模式打包页面空白 项目放根目录 -- 配置 router > index.js 修改 base const router new VueRouter({mode: history,// base: process.env.BASE_URL,base: /,routes, }) ngi…

【Redis集群专题】「集群技术三部曲」介绍一下常用的Redis集群机制方案的原理和指南(入门篇)

集群化的方案 Redis的Sentinel解决了主从复制故障不能自动迁移的问题,但是主节点的写性能和存储能力依然是受到了Redis单机容量有限的限制,所以使用Redis集群去解决这个问题,将Redis的数据根据一定的规则分配到多台机器。 Redis集群方案 R…

【git】

目录第一章 简介 1.1 版本控制 1.1.1 本地版本控制1.1.2 集中式版本控制1.1.3 分布式版本控制 第二章 基础篇 2.1 下载代码 2.2 更新代码 2.2.1 清空本地未被跟踪内容2.2.2更新代码使之与库上同步 2.3 修改 2.3.1 Vim2.3.2 Sed2.3.3 Awk 2.4 查看状态 2.5 保存代…

通俗易懂的java设计模式(3)-观察者设计模式

什么是观察者设计模式 观察者模式主要应用在对象存在一对多关系的情况下,那么如果一个对象,依赖于另一个对象,那个被依赖的对象一旦被修改,依赖于他的那个对象也会被观察者所告知。 观察者模式又被称作为发布-订阅模式&#xff0c…

2022 UUCTF

目录 <1> Web (1) websign(禁用js绕过) (2) ez_rce(?>闭合 rce) (3) ez_unser(引用传递) (4) ez_upload(apache后缀解析漏洞) (5) ezsql(union注入) (6) funmd5(代码审计 %0a绕过preg_replace) (7) phonecode(伪随机数漏洞) (8) ezpop(反序列化字符串逃逸) …

[附源码]Nodejs计算机毕业设计教师业绩考核和职称评审系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

[附源码]Nodejs计算机毕业设计教务管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

燃尽图——项目管理中的必备工具

燃尽图可以使项目经理和团队可以快速查看其工作负荷的进度以及项目按计划完成的情况。 在项目管理中&#xff0c;通过燃尽图不仅能了解项目进度&#xff0c;还能分析出项目中问题&#xff0c;及时进行风险控制。 燃尽图是用于表示剩余工作量的工作图表&#xff0c;由横轴&…

WebDAV之葫芦儿•派盘+RS文件管理器

RS文件管理器 支持WebDAV方式连接葫芦儿派盘。 手机本地文件,网盘、共享文件,如何集中管理?推荐您使用Rs文件管理器,还支持WebDAV等功能。 Rs文件管理器是一款功能强大的手机文件管理器。有强大的本地和网络文件管理功能,让您更方便的管理你的手机、平板、电脑和网盘。…

MOMO CODE SEC INSPECTOR-Java项目静态代码安全审计idea插件工具

工具地址 https://github.com/momosecurity/momo-code-sec-inspector-java安装 1、确认IDE版本&#xff1a;Intellij IDEA ( Community / Ultimate ) > 2018.32、IDEA插件市场搜索"immomo"安装。使用方式 被动&#xff1a;装完愉快的打代码&#xff0c;一边它会提…

AI作画的背后是怎么一步步实现的?一文详解AI作画算法原理+性能评测

前言 “AI作画依赖于多模态预训练&#xff0c;实际上各类作画AI模型早已存在&#xff0c;之所以近期作品质量提升很多&#xff0c;可能是因为以前预训练没有受到重视&#xff0c;还达不到媲美人类的程度&#xff0c;但随着数据量、训练量的增多&#xff0c;最终达到了现在呈现…

无约束优化:线搜索最速下降

文章目录无约束优化&#xff1a;线搜索最速下降无约束优化问题线搜索最速下降精确线搜索非精确线搜索Armijo准则Goldstein准则Wolfe准则参考文献无约束优化&#xff1a;线搜索最速下降 无约束优化问题 线搜索最速下降 对于光滑函数f(x)f(x)f(x)&#xff0c;沿着函数负梯度方向…

入门力扣自学笔记215 C++ (题目编号:1971)

1971. 寻找图中是否存在路径 题目&#xff1a; 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间…

安装 DbVisualizer pro 10.0.16,编辑器中文乱码的解决

DbVisualizer pro 10.0.16 双击安装&#xff0c; 选择下载 JRE运行后 选择 创建 桌面快捷方式 安装成功后 ping 报错无法连接到mysql &#xff0c; 驱动 所致 官方下载最新驱动 MySQL :: Download MySQL Connector/J (Archived Versions)https://downloads.mysql.com/archi…

springcloudAlibaba之seata的使用

1.seata的基础角色&#xff1a; TC(Transaction Coordainator):事务协调者&#xff0c;它维护全局和分支事务的状态&#xff0c;驱动全局事务提交和回滚 TM(Transaction Manager):事务管理器&#xff0c;它定义了全局事务的范围&#xff0c;主要包括开始全局事务、提交全局事务…

采用多层人工神经网络的能源消耗的时间序列预测(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 该项目为能源消耗的时间序列预测&#xff0c;在Matlab中实现。该预测采用多层人工神经网络&#xff0c;基于Kaggle训练集预测未…