定义

  一个类只负责一项职责

职责扩散

  什么叫职责扩散,就是职责再进行细化,就拿公司来说,好比客户的需求,需求是不断变化的,而且存在极大的不确定性,说不定哪天上司找到你要重新细化某个需求

  所以最好在职责扩散到我们无法控制的程度之前,立刻对代码进行重构

栗子

  我们先下面这段代码:

class Animal:def __init__(self,name):self.name = namedef breathe(self):print('%s用肺呼吸'%self.name)niu = Animal('小奶牛')
zhu = Animal('小白猪')niu.breathe()
zhu.breathe()

  我们很快就能从上面代码中发现一些逻辑上的错误,因为不是所有的动物都是用肺呼吸,有的使用腮呼吸的,应该将Animal类细分为陆生动物类Terrestrial,水生动物类Aquatic,代码如下:

class Animal:def __init__(self,name):self.name = nameclass Terrestrial(Animal):def breathe(self):print('%s 用肺呼吸'%self.name)class Aquatic(Animal):def breathe(self):print('%s 用腮呼吸'%self.name)c = Terrestrial('小花猫')
c.breathe()fish = Aquatic('美人鱼')
fish.breathe()

  我们看到上面代码的实现就是动物类分出两类,并把呼吸的方法写入的派生类里,好!这样做是没问题的,那看看下面这段代码:

class BreatheBehavior:def breathe(self):passclass LungBreathe(BreatheBehavior):def breathe(self):print('用肺呼吸')class CheekBreathe(BreatheBehavior):def breathe(self):print('用腮呼吸')class Animal:def __init__(self,name,breatheP):self.name = nameself.BreatheParam = breathePdef performBreathe(self):self.BreatheParam.breathe()class Terrestrial(Animal):def __init__(self,name,breatheP=LungBreathe()):super(Terrestrial,self).__init__(name,breatheP)class Aquatic(Animal):def __init__(self,name,breatheP=CheekBreathe()):super(Aquatic,self).__init__(name,breatheP)c = Terrestrial('小花猫')
c.performBreathe()fish = Aquatic('美人鱼')
fish.performBreathe()

  我们发现第二种方式,则像是用接口的形式实现了某个行为的类化,你可能会想,第二种方法的代码实现明显长的多,我为什么要用第二种方式。

  在今天的这个例子,毫无疑问是第一方法简单,那我们先来看看用单一职责原则的目的吧:

  • 目的
  1. 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多
  2. 提高类的可读性,提高程序的可维护性
  3. 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响
  4. 单一职责原则同时也适用于模块化的程序设计

  好!所以单一职责的核心无非就是降低复杂度和提高可读性以及可扩展性,假如你把要动物的种类细化再细化,按照第一种方法--你是不是要在派生类重写多个呼吸方法?但是动物的呼吸方式无非就是这几种,所以第二种方法更适合复杂的场合,所以每种方法因场景而异,自己把握!

                               欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                             笔者:拍省先生 

转载于:https://www.cnblogs.com/xinsiwei18/p/5699599.html

单一职责原则--设计模式系列相关推荐

  1. Java设计原则——单一职责原则

    我们一定要给自己提出这样的任务:第一,学习,第二是学习,第三还是学习. 学习从来无捷径,循序渐进登高峰. 目录 一.基本介绍 二.应用实例 1.示例1 2.示例2 3.示例3 三.单一职责原则 设计模 ...

  2. 设计模式-02.经典设计原则-第一节-单一职责原则,开闭原则,里式替换,接口隔离【万字长文系列】

    文章目录 设计模式经典设计原则-第一节 单一职责原则(SRP) 如何理解单一职责原则? 如何判断类的职责是否足够单一? 类的职责是否设计得越单一越好? 开闭原则(OCP) 如何理解"对扩展开 ...

  3. 每天一学设计模式(一、单一职责原则)

    引言 本文参考以下这篇文章 https://blog.csdn.net/guorui_java/article/details/125947300 定义 单一职责原则(Single responsib ...

  4. 设计模式|理解单一职责原则

    软件质量保障 专注测试圈,自动化测试.测试平台开发.测试新技术.大厂测试岗面经分享, 可以帮忙内推BATJ等大厂!欢迎加VX沟通交流: ISTE1024 很早想总结一些关于设计模式的文章了,回头看一下 ...

  5. 围观设计模式(1)--单一职责原则(SRP,Single Responsibility Principle)

    沉寂了一个月的时间,仔细学习了下设计模式,从本篇博文开始陆续更新设计模式系列的文章,我给它起了个有意思的名字叫做:"围观"设计模式,当然围观是加引号的,我写博文分享的目的一方面是将 ...

  6. 前端中会用到的设计模式之单一职责原则

    1:设计模式应用不应用,取决于对现在和未来判断后的取舍.没必要用尽量不用! 2.设计模式的目的是  减少复杂度(一个函数中包含的功能个数), 降低耦合度(一个对象与其他对象的关系个数).耦合度不能为0 ...

  7. 学习设计模式 - 六大基本原则之单一职责原则

    设计模式总共有六大基本原则,统称为SOLID (稳定)原则,分别是S-单一职责原则(Single Responsibility Principle), O-开闭原则(Open closed Princ ...

  8. 设计模式原则--单一职责原则

    单一职责原则(SRP) 定义:就一个类而言,应该仅有一个引起它变化的原因 场景: 一个公司有3类员工,分别是 主管,程序员,销售 代码: using System; using System.Coll ...

  9. 北风设计模式课程---单一职责原则

    北风设计模式课程---单一职责原则 一.总结 一句话总结: 视频教程网上一定能找到做好笔记的博客,很大几率都不需要自己做笔记.比如北风设计模式课程,https://www.cnblogs.com/xi ...

最新文章

  1. Linux Ubuntu从零开始部署web环境及项目 -----tomcat+jdk+mysql (二)
  2. pycharm 远程调试图文_Pycharm配置远程调试的图文步骤
  3. redis 数据操作命令汇总(string hash list set zset)
  4. 42. Vue、React 等前端项目部署,刷新 404 问题解决方案
  5. 最近任务-2012.05.14
  6. docker-compose安装问题
  7. idea创建git分支
  8. 【Java】数组的使用
  9. Hacker News 8 月招聘趋势榜:React 连续 15 月登顶,Python 卫冕编程语言
  10. php使用switch语句编写程序,PHP控制语句之“switch”语句实例详解
  11. 学习java.awt
  12. html邮件格式完整规范,邮件模板css及html设计规范
  13. Codeforces 633H. Fibonacci-ish II【莫队+线段树+公式】
  14. 开源资产管理系统SNIPE-IT搭建
  15. 布道微服务_18服务配置中心设计方案
  16. 史上最简单的springcloud微服务入门实例,满足企业日常需求,开箱即用,工资翻倍不是梦...
  17. x86 - 操作系统:中断、陷阱、异常、故障、终止
  18. navicat怎么备份数据和同步两个数据库
  19. Java实现多条相同数据合并为一条数据
  20. 数据预处理之白化(Whitening transformation)

热门文章

  1. 不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor
  2. 程序员辞职的7个常用理由,你用的是哪一个?
  3. 计算机硬件:内存条的基础知识笔记
  4. STM32F1 端口复用、端口(部分和完全)重映射
  5. (字节/华为/美团)前端面经记录冷冷清清的金三银四
  6. 点击页面元素,这个Vite插件竟然帮我打开了Vue组件文件!超级好用!
  7. 一个小厂前端 Leader 如何筛选候选人?
  8. React 18 RC 版本发布啦,生产环境用起来!
  9. 感谢支持,超预期重印并加码
  10. HBuilder 打包流程