【设计模式】七大设计原则--------单一职责原则

news2024/11/23 8:40:15

文章目录

  • 1.案例
    • 1.1 原始案例
    • 1.2 改进一:类上遵循单一职责原则
    • 1.3 改进二:方法上遵循单一职责原则
  • 2.小结

1.案例

1.1 原始案例

package com.sdnu.principle.singleresponsibility;
//客户端
public class singleResponsibility {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("汽车");
        vehicle.run("卡车");
    }
}
//交通工具
class Vehicle{
    public void run(String vehicle){
        System.out.println(vehicle + "在公路上跑");
    }
}

假如现在来了一架飞机,我们不可能让飞机在公路上跑吧,如下:

package com.sdnu.principle.singleresponsibility;
//客户端
public class singleResponsibility {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("汽车");
        vehicle.run("卡车");
        vehicle.run("飞机");
    }
}
//交通工具
class Vehicle{
    public void run(String vehicle){
        System.out.println(vehicle + "在公路上跑");
    }
}

在这里插入图片描述
显然不符合常理。显然违反单一职责原则。

1.2 改进一:类上遵循单一职责原则

package com.sdnu.principle.singleresponsibility;
//客户端
public class SingResponsibility2 {
    public static void main(String[] args) {
        RoadVehicle roadVehicle = new RoadVehicle();
        roadVehicle.run("汽车");
        roadVehicle.run("卡车");
        AirVehicle airVehicle = new AirVehicle();
        airVehicle.run("飞机");
    }
}

class RoadVehicle{
    public void run(String vehicle){
        System.out.println(vehicle + "在地上跑");
    }
}

class AirVehicle{
    public void run(String vehicle){
        System.out.println(vehicle + "在天上飞");
    }
}

在这里插入图片描述
我们对类进行了分解,这样做虽然符合了类上单一职责原则,但是需要修改太多东西了,而且需要修改客户端。

1.3 改进二:方法上遵循单一职责原则

package com.sdnu.principle.singleresponsibility;

public class SingResponsibility3 {
    public static void main(String[] args) {
        Vehicle3 vehicle = new Vehicle3();
        vehicle.runOnRoad("汽车");
        vehicle.runOnRoad("卡车");
        vehicle.runOnAir("飞机");
    }
}

class Vehicle3{
    public void runOnRoad(String vehicle){
        System.out.println(vehicle + "在路上运行");
    }
    public void runOnAir(String vehicle){
        System.out.println(vehicle + "在空中飞行");
    }
}

在这里插入图片描述
这种方法虽然没有在类上遵循单一职责原则,但是在方法上遵循了单一职责原则。并且改动很小,只需要在Vehicle中添加一个方法而已。(严格来说没有遵循单一职责原则)

2.小结

(1) 注意标准的单一职责原则是在类级别上
(2)注意事项:

  • 降低类的复杂程度,一个类只负责一个职责。
  • 提高类的可读性,可维护性。
  • 降低变更引起的风险。
  • 通常情况下,我们应该遵循单一职责原则,只有逻辑足够简单,才可以在代码级别上违法单一职责原则。只有类中的方法数量足够少,才可以在方法级别上保持单一职责原则。

(3)核心:单一职责原则的实际上是一个类应该只负责一项职责,以此控制类的粒度大小、将对象解耦、提高其内聚性,但是对于粒度的大小需要有经验的开发者自己把握。

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

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

相关文章

选择什么电容笔比较好?平价好用的iPad电容笔推荐

科学技术的迅速发展使人们的生活发生了巨大的变化。如今,众多的电子和数码产品层出不穷,而这种能够与平板电脑配套的电容笔也是如此。随着电容笔的不断发展,其应用范围也将不断扩大,今天,我将向大家推荐一些具有较高性…

总结:一文搞懂chatGPT原理

目前关于chatGPT的资料过于零散,没有详尽所有知识点、系统概述的文章,因此,笔者作了这篇总结性文章。 训练过程总览 理清演化路径 预训练(pretrain) GPT-3概述 GPT 3模型的理念 GPT-3如何学习 数据集 指令微调 (Instruction Fine-Tunin…

八大排序之交换排序与计数排序

此篇更新完成后,八大排序已经全部写完,还请各位可以多多支持!🥰 八大排序之选择排序_冷兮雪的博客-CSDN博客 八大排序之插入排序和归并排序_冷兮雪的博客-CSDN博客 目录 交换排序的基本思想🍭 一、冒泡排序&#x1f…

JS文件断点续传的切割与合并

总结一下大文件分片上传和断点续传的问题。因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况。http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件切片(…

基于html+css的图展示43

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

制冷暖通工业互联网平台建设

制冷暖通工业互联网平台建设需要遵循一定的流程,具体步骤如下: 需求分析:了解客户需求,包括业务流程、系统功能、界面设计等方面。 系统设计:基于需求分析,进行系统设计,包括系统结构、数据库设…

【细读Spring Boot源码】prepareContext之load

前言 启动过程中准备上下文中有一步加载在资源,下面看下详情 详情 调用点 private void prepareContext(DefaultBootstrapContext bootstrapContext, ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunListen…

大模型跨界研究:计算精神病学发现,大模型居然比人类更焦虑

夕小瑶科技说 原创作者 | 小戏、iven 纽约时报的记者凯文鲁斯(Kevin Roose)在 2 月份和必应的大模型 Sydney 聊了两个小时天,却惊讶的收到了这样一条回复“我是 Sydney,我爱上了你”。 鲁斯向 Sydney 讲了一些关于荣格“黑暗自我”…

python哲学

进入python编辑器模式下,输入import this 会打印python之禅(The Zen of Python) Beautiful is better than ugly. 优美胜于丑陋。 Explicit is better than implicit. 明了胜于晦涩。 Simple is better than complex. 简单胜过复杂。 Complex is better than co…

写给初学者的YOLO目标检测 概述

文章目录 什么是目标检测What is YOLO?为什么YOLO在目标检测领域如此流行?1. 速度快2. 高检测精度3. 更好的泛化性4. 开源 YOLO架构YOLO目标检测是如何工作的?残差块(Residual blocks)边界框回归(Bounding box regression)交并比…

项目中的统一异常处理

目录 1:异常处理 1.1:异常问题分析 1.2:统一异常处理实现 1.2.1:全局异常处理器 1.2.2:自定义异常类 1.2.3:统一响应前端异常信息封装类 1.2.4:通用的异常信息枚举类 1.2.5:…

Android Studio小白安装教程,以及第一个Android项目案例的调试运行

小白友好型教学: 本文从小白角度出发,手把手教你一步一步成功安装“Android Studio”,并结合案例,编写你的第一个手机APP到手机上运行。由于安装过程较长,建议大家跟着截图,注意细节,不然容易出…

改进YOLOv8 | Neck篇 | YOLOv8 应用轻量级通用上采样算子CARAFE | 《特征的内容感知重组》

特征上采样是现代卷积神经网络架构中的关键操作,例如特征金字塔。其设计对于密集预测任务,如目标检测和语义/实例分割至关重要。在本研究中,我们提出了一种称为内容感知特征重组(CARAFE)的通用、轻量级且高效的操作符,以实现这一目标。CARAFE具有以下几个优点:(1)大的…

Visual Studio 2019 C# 上位机入门(1):如何创建工程编写一个简单应用

Visual Studio 2019下载安装步骤可以看:https://blog.csdn.net/weixin_44788542/article/details/114271126 这里不赘述,默认电脑上已经安装好了。 1、打开安装好的Visual Studio后,选择创建新项目。 2、找到选择C#下面的Windows 窗体应用&…

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?

前言 我们知道 Spring Cloud Gateway 最终一定会将请求路由到后端的真实服务上,那么你知道 Spring Cloud Gateway 是在哪里调用的后端服务吗? 源码之下无秘密,让我们一起从源码中寻找答案。 源码分析 上图是来自Spring Cloud Gateway 官网…

Apache Druid RCE漏洞复现(QVD-2023-9629)

0x01 产品简介 Apache Druid是一个高性能的实时大数据分析引擎,支持快速数据摄取、实时查询和数据可视化。它主要用于OLAP(在线分析处理)场景,能处理PB级别的数据。Druid具有高度可扩展、低延迟和高吞吐量的特点,广泛应…

快手智能处理与编码算法产品化之路

视频转码过程中涉及方方面面的视频图像算法,如何将算法有机地结合起来,打造成为行业领先的视频转码算法产品?通过多年的业务场景打磨和积累,快手音视频走出了一条自己的产品化之路。LiveVideoStackCon 2022北京站邀请到了快手视频…

生成式AI火爆全球,你是否已经做好了准备?

2023年,随着ChatGPT的火爆全球,生成式AI也引发了各界人士的广泛关注。一时间,从国际科技巨头到国内人工智能企业,几乎所有我们耳熟能详的科技公司,都纷纷杀入了生成式AI市场。 作为全球云计算技术的开创者和领导者&…

【python中的对象存储:堆?栈?】

堆空间和栈空间 堆空间和栈空间是计算机内存中的两个存储区域,主要的区别有以下几点: 分配方式:栈空间中的内存由编译器或解释器自动分配和释放,无需手动干预。堆空间中的内存则需要由程序员手动申请和释放。内存大小&#xff1…

招商基金数字化转型下的研发管理|发布会精彩回顾

在 4 月 20 日举行的《中国企业软件研发管理白皮书》发布会上,招商基金信息技术部副总监、研发中心主管刘志昆作了《招商基金数字化转型下的研发管理》主题演讲,从数字化转型背景、研发管理所遇到的挑战出发,讲述招商基金如何摸索出适合自身环…