单一职责原则

基本介绍

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

例如UserDao只负责对User的增删查改

例如一个Dao又对User进行增删改查又对Order进行增删查改,这就违背了单一职责,
此时可以拆分成UserDao和OrderDao

问题代码示例

/*** 非单一职责*/
public class SingleResponsibility1 {public static void main(String[] args) {Vehicle vehicle = new Vehicle();vehicle.run("摩托车");vehicle.run("小汽车");// 这里就违反了单一职责,飞机不能在公路上跑vehicle.run("飞机");}
}/*** 交通工具类*/
class Vehicle {/*** 如果传递进来的是飞机, 这里就违背了单一职责** @param vehicle 需要run的交通工具*/public void run(String vehicle) {System.out.println(vehicle + " 在公路上跑....");}
}

上面代码的输出结果, 这里的Vehicle类的run方法就违背了单一职责原则

修改上面的代码,遵守单一职责

/*** 单一职责*/
public class SingleResponsibility2 {public static void main(String[] args) {// 路上跑的RoadVehicle roadVehicle = new RoadVehicle();roadVehicle.run("小汽车");roadVehicle.run("摩托车");// 天上飞的AirVehicle airVehicle = new AirVehicle();airVehicle.run("波音747");// 水里跑的WaterVehicle waterVehicle = new WaterVehicle();waterVehicle.run("辽宁舰航母");}
}/*** 公路运行交通工具类*/
class RoadVehicle {/*** @param vehicle 需要在公路运行的交通工具*/public void run(String vehicle) {System.out.println(vehicle + "公路运行");}
}/*** 天上运行交通工具类*/
class AirVehicle {/*** @param vehicle 需要在天上运行的交通工具*/public void run(String vehicle) {System.out.println(vehicle + "天上运行");}
}/*** 水上运行交通工具类*/
class WaterVehicle {/*** @param vehicle 需要在水上运行的交通工具*/public void run(String vehicle) {System.out.println(vehicle + "水上运行");}
}

上面的代码输出如下,虽然确实实现了单一职责,但是对代码的改动太大,需要分解类,同时会增加调用方的代码,不是很好

最后优化的单一职责

/*** 优化后的单一职责*/
public class SingleResponsibility3 {public static void main(String[] args) {Vehicle2 vehicle2 = new Vehicle2();// 根据不同的交通工具调用不同的方法vehicle2.runOnAir("波音747");vehicle2.runOnWater("辽宁号航母");vehicle2.runOnRoad("小汽车");vehicle2.runOnRoad("摩托车");}
}/**- 运行交通工具的类*/
class Vehicle2 {/*** 在公路运行的方法** @param vehicle 交通工具*/public void runOnRoad(String vehicle) {System.out.println(vehicle + "公路运行");}/*** 在水上运行的方法** @param vehicle 交通工具*/public void runOnWater(String vehicle) {System.out.println(vehicle + "水上运行");}/*** 在天上运行的方法** @param vehicle 交通工具*/public void runOnAir(String vehicle) {System.out.println(vehicle + "天上运行");}
}

这种修改方法没有对原来的类做大的修改,只是增加了方法。
虽然在类这个级别上没有遵循单一职责,但是在方法上遵循了。

总结

单一职责原则注意的事项和细节

  • 降低类的复杂度,一个类只负责一项职责
  • 提高类的可读性,可维护性
  • 降低变更引起的风险
  • 通常情况下,我们应当遵循单一职责原则。如果类里面的方法数量足够少,就可以选择在方法级别上保持 单一设计原则;如果类里面设计到的方法太多,还是应该选择从类级别保持单一设计原则。

设计模式-七大原则-单一职责原则相关推荐

  1. Java设计模式七大原则-单一职责原则

    目录 概述:设计模式的目的 设计模式七大原则 单一职责原则 单一职责原则注意事项和细节 概述:设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等 ...

  2. 大话设计模式三之单一职责原则、开放-封闭原则、依赖倒置原则、里氏代换原则

    单一职责原则 单一职责原则(SRP),意思就是说,功能要单一.准确解释是,就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或 ...

  3. 设计模式原则—单一职责原则

    设计模式概念与作用: 设计模式是一套被反复使用的.多数人知晓.经过分类编目的优秀代码设计经验的总结.特定环境下特定问题的处理方法. 1)重用设计和代码 重用设计比重用代码更有意义,自动带来代码重用 2 ...

  4. android activity解耦,Android与设计模式:用单一职责原则为Activity解耦

    一.什么是单一职责原则单一职责原则(SRP:Single responsibility principle)又称单一功能原则,其定义为:一个类,应该只有一个可以导致变化的原因.光看概念 一.什么是单一 ...

  5. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  6. 六大设计原则-单一职责原则

    1.开闭原则        2.接口隔离原则 3.依赖倒置原则 4.迪米特原则             5.里氏替换原则     6.单一职责原则 单一职责原则 针对的问题 类T负责两个不同职责:职责 ...

  7. 【设计模式】软件设计七大原则 ( 单一职责原则 | 代码示例 )

    文章目录 一.单一职责原则简介 二.单一职责原则代码示例 ( 反面示例 ) 1.不遵循单一职责原则的类 2.测试类 三.单一职责原则代码示例 ( 正面示例 | 类的单一职责 ) 1.用翅膀飞的鸟 2. ...

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

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

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

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

最新文章

  1. Alexa偷录私密对话并发送,继诡笑之后出现又一神举动
  2. C#中的==、Equal、ReferenceEqual(转载)
  3. vue依赖缓存_Vue SSR服务端渲染之数据缓存
  4. 微软从安卓那里获取的盈利比重WinPhone 7还多
  5. 通过AT指令控制ESP8266
  6. mysql function
  7. 转 Django url 标签的使用
  8. 百度天链平台:企业区块链技术赋能产业创新落地
  9. 从技术角度谈一谈,我参与设计开发的手Q春节红包项目
  10. layui icon服务器上显示不出来,关于layui的动态图标不显示的解决方法
  11. mac 字体微软雅黑字体_在Microsoft Word 2007中搜索和替换特定格式(字体,样式等)...
  12. B2C 和 C2C 你们是怎么区别的?
  13. android6最新版本,安卓版“AirDrop”发布,安卓6版本以上都能用!
  14. 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台
  15. 2021.4.14 html学习第二天
  16. 汽车高级驾驶辅助系统ADAS功能盘点
  17. [软件工程 复习] 记录
  18. 微信小程序上实现 table 表格
  19. 网易邮箱VIP注册页面可部分绕过Windows安全中心的验证
  20. 波奇C语言模拟通讯录设计

热门文章

  1. 【团队建设】团队建设之初篇
  2. 河南艺术职业学院计算机怎么样,河南艺术职业学院好不好,多少分可以上附真实评价...
  3. Http Post注册QQ号码 分析流程图 更新时间20141206
  4. node.js卸载、安装、配置详解
  5. Python自建Moudle导入时ModuleNotFoundErro问题的解决方法
  6. java邮件抄送_Java发送邮件遇到的常见需求汇总
  7. 无学历,无技能,无背景,怎么找工作呢?
  8. dotnet C# 如何正确获取藏文的字数
  9. 网络系统集成工程师——十八般武艺
  10. 假如有机会重新学习计算机