文章目录

  • 一、单一职责原则简介
  • 二、单一职责原则代码示例 ( 反面示例 )
    • 1、不遵循单一职责原则的类
    • 2、测试类
  • 三、单一职责原则代码示例 ( 正面示例 | 类的单一职责 )
    • 1、用翅膀飞的鸟
    • 2、用脚走的鸟
    • 3、测试类
  • 四、单一职责原则代码示例 ( 接口的单一职责 )
    • 1、反面示例
    • 2、拆分出的接口 1
    • 3、拆分出的接口 2
    • 4、接口实现类
  • 五、单一职责原则代码示例 ( 方法的单一职责 )
    • 1、反面示例
    • 2、单一职责示例

一、单一职责原则简介


单一职责原则 : 不要存在 多余一个 导致 类变更的原因 ;

假设有一个类 , 负责 222 个职责 , 职责 111 和 职责 222 ;
一旦 需求发生变更 , 如 职责 111 相关功能发生改变 ;
修改该类的 职责 111 功能时 , 有可能导致原本运行正常的职责 222 发生故障 ;

对于上述类 , 应该 分别针对 职责 111 和 职责 222 , 各自建立一个独立的类 , 这样就保证了系统的稳定性 ;
这样修改 职责 111 和 职责 222 中的任何一个功能 , 都不会影响另外一个职责的功能 ;

推荐的开发方法 : 使一个 类 / 接口 / 方法 只负责一项职责 ;

单一职责优点 : 提高 类的 可读性 , 提高 系统的 可维护性 , 降低 类的复杂度 , 降低 变更引起的风险 ;

类越简单 , 可读性越好 , 同时提高了可维护性 ;
一个类只负责一个职责 , 比负责多个职责 , 类要 简单得多 ;
变更是必然的 , 必须要接收变更 , 如果 单一职责原则遵守的好 , 当修改一个功能时 , 可以 显著降低对其它功能的影响 ;

单一职责原则 不只是 面向对象 设计中特有的职责 , 只要是模块化的系统 , 都适合使用单一职责原则 ;

二、单一职责原则代码示例 ( 反面示例 )


1、不遵循单一职责原则的类

Bird 类 , 代表了所有的鸟类 , 主要的移动方式是 用翅膀飞 , 和 用脚走 ;

如果要加入新的鸟 企鹅 , 就需要修改该类的代码 , 在 if … else … 上添加新的分支 , 一旦修改 , 就会导致当前类存在潜在风险 , 影响其它的功能 ;

package singleresponsibility;public class Bird {public void mainMoveMode(String name) {if ("鸵鸟".equals(name)) {System.out.println(name + " 用翅膀飞");} else {System.out.println(name + " 用脚走");}}
}

2、测试类

package singleresponsibility;public class Main {public static void main(String[] args) {Bird bird = new Bird();bird.mainMoveMode("大雁");bird.mainMoveMode("鸵鸟");}
}

执行结果 :

大雁 用脚走
鸵鸟 用翅膀飞

三、单一职责原则代码示例 ( 正面示例 | 类的单一职责 )


上面反面示例中 , Bird 类承担了 222 个职责 , 用翅膀飞的鸟 和 用脚走的鸟 的职责都在一个类中实现 , 这就导致了一旦修改一个职责 , 另外一个也有可能被影响 ;

1、用翅膀飞的鸟

package singleresponsibility;/*** 用翅膀飞的鸟*      本类的职责单一 , 只负责用翅膀飞的鸟的移动*/
public class FlyBird {public void mainMoveMode(String name) {System.out.println(name + " 用翅膀飞");}
}

2、用脚走的鸟

package singleresponsibility;/*** 用脚走路的鸟*      本类的职责单一 , 只负责用脚走的鸟的移动*/
public class WalkBird {public void mainMoveMode(String name) {System.out.println(name + " 用脚走");}
}

3、测试类

package singleresponsibility;public class Main {public static void main(String[] args) {FlyBird flyBird = new FlyBird();flyBird.mainMoveMode("大雁");WalkBird walkBird = new WalkBird();walkBird.mainMoveMode("鸵鸟");}
}

执行结果 :

大雁 用脚走
鸵鸟 用翅膀飞

四、单一职责原则代码示例 ( 接口的单一职责 )


1、反面示例

该 IGood 接口负责两大块职责 , 获取商品信息 获取 名称 / 价格 , 管理商品 购买 / 退款 ;

这个接口设计 , 违背了单一职责原则 ;

package singleresponsibility;/*** 该接口负责两大块职责*      获取商品信息 获取 名称 / 价格*      管理商品 购买 / 退款* 这样就违背了单一职责原则*/
public interface IGood {/*** 获取商品名称* @return*/String getName();/*** 获取价格* @return*/double getPrice();/*** 购买商品*/void buyGood();/*** 退款*/void refund();
}

2、拆分出的接口 1

package singleresponsibility;/*** 信息管理*      该接口负责 获取商品信息 获取 名称 / 价格*/
public interface IGoodInfo {/*** 获取商品名称* @return*/String getName();/*** 获取价格* @return*/double getPrice();
}

3、拆分出的接口 2

package singleresponsibility;/*** 商品管理*      负责商品的 购买 / 退款*/
public interface IGoodManager {/*** 购买商品*/void buyGood();/*** 退款*/void refund();
}

4、接口实现类

package singleresponsibility;/*** 商品实现类*      同时实现 IGoodManager 和 IGoodInfo 两个接口*/
public class GoodImpl implements IGoodManager, IGoodInfo{@Overridepublic String getName() {return null;}@Overridepublic double getPrice() {return 0;}@Overridepublic void buyGood() {}@Overridepublic void refund() {}
}

五、单一职责原则代码示例 ( 方法的单一职责 )


如果一个方法中 , 存在了 大块的 if … else … 判定 , 说明应该将其拆分成两个不同的方法 ;

1、反面示例

package singleresponsibility;public class Good {/*** 更新商品的 名称 和 价格信息*      该方法的职责就不是单一职责的*      如果要针对 价格 信息修改策略进行修改*      会连带这 另外一个 职责 修改名称 , 也存了未知风险* @param name* @param price*/public void updateGoodInfo(String name, double price) {}
}

2、单一职责示例

package singleresponsibility;public class Good {/*** 更新商品的名称* @param name*/public void updateGoodName(String name) {}/*** 更新商品的价格* @param price*/public void updateGoodPrice(double price) {}
}

【设计模式】软件设计七大原则 ( 单一职责原则 | 代码示例 )相关推荐

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

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

  2. 设计原则-单一职责原则

    单一职责原则 文章目录 单一职责原则 概述 单一职责原则问题由来 职责如何理解呢? 什么是职责呢 ? 举例1 Rectangle 个人理解 举例2 Modem SRP核心思想 总结 参考文档 概述 在 ...

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

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

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

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

  5. 设计规则之单一职责原则

    tip: 需要<设计模式之禅>的pdf,可以联系我 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了.我们应该让自己写的代码更加优雅,即使这会费时费力. 相关规则: ...

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

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

  7. 设计模式-软件设计七大原则

    目录 综述 1.开闭原则 1.1开闭原则的定义 1.2开闭原则的作用 1.3开闭原则的实现方法 2.里氏替换原则 2.1里氏替换原则的定义 2.2里氏替换原则的作用 2.3里氏替换原则的实现方法 3. ...

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

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

  9. 七大设计原则-单一职责原则

    文章目录 前言 基本介绍 应用实例 方案1 方案2 方案3 注意事项 前言 设计模式相关文章主要来自B站尚硅谷的学习视频的心得 B站视频传送门 设计模式系列文章传送门23种设计模式系列合集 有空会慢慢 ...

最新文章

  1. 冻结拆分_冻结首行与尾行?还有能这种操作
  2. android wear2.9新功能,Android Wear 2.0确认2月9日正式登场
  3. linux遍历目录源代码
  4. ajax的访问 WebService 的方法
  5. Linux学习总结(4)——Centos6.5使用yum安装mysql——快速上手必备
  6. mysql评论与回复一起查_mysql 查询所有评论以及回复
  7. Bean和Spirng模块
  8. python四种方法实现去除列表中的重复元素
  9. Kubernetes如何删除deployment
  10. Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具
  11. pip下载速度慢的解决办法
  12. 个人总结 超详细 windows10下载与安装
  13. 互联网常用系统监控工具
  14. 博客专家申请规则变更调整
  15. flask 起服务 、访问
  16. Markdown语法笔记
  17. c51实现老人跌倒,心率异常报警系统
  18. 周计划周记录:2022年6月6日-2022年6月12日
  19. 【codeforces 821E】Okabe and El Psy Kongroo
  20. mysql查询最小分数_MySQL数分:简单查询

热门文章

  1. 后台接口数量及粒度的一些思考总结
  2. 专业课学习——建立 SCT 数据库
  3. 护眼台灯真的护眼吗?为家长推荐四款真正护眼的台灯
  4. 成都java培训一般需要多久
  5. 【P2P overlay network】跨内外网络虚拟私有云
  6. HIT-ICS2022大作业-程序人生-Hello’s P2P
  7. The Codeless Code: Case 5 Void(void本质是什么)
  8. 北大计算机图灵班,北京大学举办图灵班开班仪式
  9. 国内计算机博士去百度云,于博士Cadence视频教程60集全套百度网盘分享
  10. 计算机音乐谱消愁,消愁简谱-毛不易-歌词字字扎心,听者个个飙泪