面向对象设计原则——单一职责原则

2023-11-09

        单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。

        单一职责原则(Single Responsibility Principle,SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。

        单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。

实例分析:

例如有一个类有以下设计:

图中connectionDatabase() 用来连接数据库,queryData()查询数据库,displayInterface()显示数据,现在用单一职责对其进行重构:

        FunctionManager类承担了太多的职责,既包含数据库相关方法,又包含数据显示的方法,如果在其它类中也需要连接数据库或者使用queryData()方法查询客户信息,则难以实现代码重用。无论是修改数据库连接方式还是修改图表显示方式都需要修改该类,它不止一个引起它变化的原因,违背了单一职责原则,因此需要对该类进行拆分,使其满足单一职责原则,该类可以拆分成三个部分:

  • DBUtil:负责连接数据库,包含connectionDatabase();

  • OperationDAO:负责操作数据库,如增、删、改、查操作,包含queryData();

  • DataChart:负责数据显示,包含displayInterface();

 

使用单一职责后的结构图:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象设计原则——单一职责原则 的相关文章

  • Linux网络编程基础知识

    网络编程 本质 使用操作系统的接口函数 使得应用程序具备收发网络数据的能力 核心概念 协议 为进行数据通信而预定义的数据规则 地址 网络通信中的用于标识设备的整数值 端口号 设备为收发数据而指定的数值 用于标识具体链接 可理解为 设备中用于
  • 关于2020HUEL_ACM暑期集训八月集训计划变更

    时间飞逝若白驹过隙 转眼2020疫情期间这个特殊的暑假已经过去一半 因为一些原因我们第二个月不与hky一起训练了 正常周赛 咱们的集训计划也会发生相应的改变 具体如下 时间安排 八月共四个周 第一周 继续学习最小生成树 2天 和最短路 4天
  • 屏幕适配方案

    屏幕dp px换算公式 其中width height为我们的手机屏幕宽高 即1920 1080 inch为对角尺寸 常见5 5寸 5 0寸等 public void getAndroiodScreenProperty WindowManag
  • 机器学习集成模型学习——投票集成Voting(二)

    Voting集成 投票机制就是多个模型分别预测 然后投票 票数最高的就是整个模型最后的效果 案例代码 from sklearn linear model import LogisticRegression from sklearn naiv
  • github访问很慢的问题

    github访问很慢的问题 公司一直用着svn 之前也的确用过github的版本管理 但是一直都是可视化的操作 这几天面试了几名前端 问了一下发现他们在之前的公司里都是用git的 于是今天好好温故了一下怎么用命令行进行一下git操作 首先要
  • R语言合并数据框的行与列

    合并数据框的行与列 大家好 这里是想做生信大恐龙 的生信小白 先赞后看养成习惯 还没关注的小伙伴点点关注不迷路 今天熟悉数据操作中的数据合并 数据合并 合并数据框的行与列 一 rbind 和cbind 函数 二 merge 函数 总结 一

随机推荐

  • 【日常实用】git rebase合并多笔为一笔提交

    前言 在日常开发中 经常会遇到master分支和自己的分支已经渐行渐远 分叉久已 此时并不能用get merge 的方式合并代码了 这个时候想要将多笔提交合并成一笔并解决好冲突提交话 get rebase 就派上了用场了 举例说明 一 新建
  • kibana使用

    数据导出 查询完数据后 数据量很大 我们要对数据进行分析 可以导出来用excel分析 导出很简单 就是先保存后分享就可以了 使用kibana界面导出数据 我们要进行重复行统计的时候 可以使用excel的数据透视表 很强大 excel如何快速
  • EM算法

    尽管最大似然估计 MLE 和EM都可以找到 最佳拟合 参数 但是它们查找模型的方式却大不相同 MLE首先累积所有数据 然后使用该数据构建最可能的模型 EM首先对参数进行猜测 考虑丢失的数据 然后对模型进行调整以适合猜测和观察到的数据 该算法
  • 【IDEA】IDEA git log 点击 没有代码变更

    文章目录 1 概述 1 概述 Git log 下查看分支提交的信息 结果只有提交信息 没有代码变更信息 如下图 这里有坑 不是消失了 是下拉框拉倒最上面了 这里有条线 往下拉就能看到了
  • 使用kubeadm工具升级kubernetes

    一 背景 kubeadm部署的kubernetes集群进行升级 通常先升级控制节点 控制节点升级完成后再升级工作节点 本博文只升级了控制节点 工作节点按照相同的流程进行升级即可 环境说明 主机名 节点 11 0 1 200 k8s客户端操控
  • show_space存储过程脚本

    CREATE OR REPLACE PROCEDURE show space p segname 1 IN VARCHAR2 p type 1 IN VARCHAR2 DEFAULT TABLE p space IN VARCHAR2 DE
  • 程序下载微云

    https share weiyun com 5OxmUiI
  • python/sympy计算施密特正交化向量

    sympy的符号计算功能很强大 学习矩阵分析 重温了线性代数中施密特正交化的方法 正好可以用sympy解决一些计算问题 施密特正交化 也称 Gram Schmidt 正交化过程 Gram Schmidt Orthogonalization
  • 【linux】01 dnf 命令安装(新的代替yum 的安装方式)

    一 dnf 介绍 参考文章 DNF 是新一代的 rpm 软件包管理器 他首先出现在 Fedora 18 这个发行版中 而最近 它取代了 yum 正式成为 Fedora 22 的包管理器 DNF 包管理器克服了 YUM 包管理器的一些瓶颈 提
  • jdk8特性Collections.sort()的使用

    Java中Collections sort 的使用学习记录 在日常开发中 很多时候都需要对一些数据进行排序的操作 然而那些数据一般都是放在一个集合中如 Map Set List 等集合中 他们都提共了一个排序方法 sort 要对数据排序直接
  • k8s服务(service)详解

    目录 1 Service介绍 1 1 kube proxy支持的工作模式 userspace 模式 iptables 模式 ipvs 模式 2 Service类型 3 Service使用 3 1 实验环境准备 3 2 ClusterIP类型
  • vue3中使用jsx报错React is not defined和h is not defined

    js项目中jsx的使用 js项目引入Vue 3 Babel JSX 插件 修改vite config js import defineConfig from vite import vue from vitejs plugin vue im
  • python定时器

    一 定时器 在实际应用中 我们需要使用定时器去触发一些事件 Python中的定时器是timer 首先看个例子 import datetime 导入datetime模块 import threading 导入threading模块 def r
  • Hbase Java API 介绍

    Hbase Java API 介绍 几个主要 Hbase API 类和数据模型之间的对应关系 1 HBaseAdmin 关系 org apache hadoop hbase client HBaseAdmin 作用 提供了一个接口来管理 H
  • 超详细的人脸检测:MTCNN代码分析,手把手带你从零开始码代码

    前言 之前我发过MTCNN的原理分析 不了解的朋友可以看看深刻理解MTCNN原理 超级详细 从零开始做人脸检测 Tensorflow2实现 授人以鱼 不如授人以渔 本文与其他代码分析的文章不一样 本文不会涉及原理过多的东西 原理参照我的上一
  • react 安装

    安装react脚手架 npm i g create react app 创建react项目 npx create react app react project react project为项目名
  • 使用ping检测MTU值

    ping ping Packet Internet Groper 是一种因特网包探索器 用于测试网络连接量的程序 Ping是工作在 TCP IP网络体系结构中应用层的一个服务命令 主要是向特定的目的主机发送 ICMP Internet Co
  • sql语句-如何以一个表中的数据为条件据查询另一个表中的数据

    下面这个是SQL语句的一个基本样式 select from 表2 where 姓名 in select 姓名 from 表1 where 条件 实例需求 在项目中是这样应用的 我需要根据库位编号去查找库位信息表里查找库位上放的的料箱编号 我
  • C++-----动态规划

    目录 一 动态规划的基本思想 二 设计动态规划法的步骤 三 动态规划问题的特征 4 1 矩阵连乘积问题 4 1 1 分析最优解的结构 4 1 2 建立递归关系 4 1 3 计算最优值 4 1 3 计算最优值 4 1 3 构造最优解 4 2
  • 面向对象设计原则——单一职责原则

    单一职责原则是最简单的面向对象设计原则 它用于控制类的粒度大小 单一职责原则 Single Responsibility Principle SRP 一个类只负责一个功能领域中的相应职责 或者可以定义为 就一个类而言 应该只有一个引起它变化