当前位置: 首页 > news >正文

面向对象编程原则(02)——单一职责原则


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

参考资料

  1. 《大话设计模式》 作者:程杰
  2. 《Java设计模式》 作者:刘伟
  3. 《图解设计模式》 作者:结城浩
  4. 《重学Java设计模式》 作者:付政委
  5. 《Head First设计模式》作者:埃里克·弗里曼

单一职责原则概述

单一职责原则(Single Responsibility Principle, SRP)是最简单的面向对象设计原则;它常用于控制类的粒度大小。

该原则定义如下:

一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。

Every object should have a single responsibility,and that responsibility should be entirely encapsulated by the class.

在软件系统中一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小;而且一个类承担的职责过多,相当于将这些职责耦合在一起,当其中一个职责变化时可能会影响其他职责的运作。因此要将这些职责进行分离,将不同的职责封装在不同的类中。即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。

单一职责原则是实现高内聚、低耦合的指导方针。它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。

单一职责原则案例

在CustomerDataChart类中:

  • getConnection( )用于连接数据库
  • findCustomers( )用于查询所有客户信息
  • createChart( )用于创建图表
  • displayChart( )用于显示图表
    在这里插入图片描述
    CustomerDataChart类承担了太多的职责,既包含与数据库相关的方法,又包含与图表生成和显示相关的方法。如果在其他类中也需要连接数据库或者使用
    findCustomers()方法查询客户信息,则难以实现代码的重用。无论是修改数据库连接方式还是修改图表显示方式都需要修改该类,它拥有不止一个引起它变化的原因,违背了单一职责原则。

因此,需要对该类进行拆分使其满足单一职责原则,可将CustomerDataChart类拆分为以下3个类。

  • 1、DBUtils:负责连接数据库,包含数据库连接方法getConnection( )。
  • 2、CustomerDAO:负责操作数据库中的Customer表,包含对Customer表的增、删、改、查等方法,例如findCustomers( )方法。
  • 3、CustomerDataChart:负责图表的生成和显示,包含createChart( )方法和displayChart( )方法。

相关文章:

  • C++面向对象程序设计(第2版)第二章(类和对象的特性)知识点总结
  • 学习springboot杂乱无章的笔记
  • java计算机毕业设计红河旅游信息服务系统源码+数据库+系统+lw文档+mybatis+运行部署
  • Pytorch 实战 LESSON 16 深度学习视觉入门 上
  • 10.VScode下载---Windows64x
  • java计算机毕业设计互联网保险网站源码+数据库+系统+lw文档+mybatis+运行部署
  • Linux14 NAT网络配置原理 查看网络ip和网关 修改ip地址 指定ip方法 主机名与hosts映射 主机名解析过程
  • SPDK Vhost在线恢复:让I/O飞一会儿
  • 如何判断一个低代码平台是否专业?
  • 达利欧《原则》读书思考笔记
  • C语言动态内存管理、柔性数组(超详细版)
  • 【USB设备设计】-- CDC 设备开发(虚拟串口设备)
  • 用ARM进行汇编语言编程(3)逻辑移位和轮换,条件与分支
  • maltab datenum函数与正则表达式巧用:逐日数据转为逐月数据、日序转月序
  • PTA JAVA02 基础语法1
  • @jsonView过滤属性
  • 【剑指offer】让抽象问题具体化
  • 2017 前端面试准备 - 收藏集 - 掘金
  • egg(89)--egg之redis的发布和订阅
  • es6
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • golang中接口赋值与方法集
  • JavaScript DOM 10 - 滚动
  • JavaScript类型识别
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js如何打印object对象
  • Linux Process Manage
  • Node + FFmpeg 实现Canvas动画导出视频
  • Python 反序列化安全问题(二)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue2.0项目引入element-ui
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 三栏布局总结
  • 手写双向链表LinkedList的几个常用功能
  • 我的业余项目总结
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • (003)SlickEdit Unity的补全
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (十) 初识 Docker file
  • (十六)串口UART
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转载)利用webkit抓取动态网页和链接
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET中两种OCR方式对比
  • .php文件都打不开,打不开php文件怎么办
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [<MySQL优化总结>]