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

设计模式:单一职责原则

想象一把瑞士军刀 vs. 一套专业厨具🔪

  1. 瑞士军刀 (违背 SRP 的类):

    • 它功能超多!能开瓶盖、开罐头、拧螺丝、削水果、甚至有小剪刀和小锯子。

    • 看起来很方便,对吧?但问题来了:

      • 太“累”了: 它要负责的事情太多了。削水果时,开罐头的部件硌手;拧螺丝时,刀片容易滑。

      • 难“修”/“改”: 如果剪刀坏了,你要修理整个瑞士军刀,可能会影响其他功能,或者干脆就得换掉整把刀。

      • 难“借”给别人用: 你只想借剪刀给别人用?不行,你得把整个多功能刀都借出去,别人可能根本不需要其他功能。

      • 一个变化影响所有: 厂家想改进开瓶器设计?可能得动整个刀的结构,不小心就把螺丝刀改坏了。

  2. 专业厨具套装 (遵循 SRP 的设计):

    • 这里分工明确:

      • 菜刀: 唯一职责就是切菜切肉。(对应 CustomerDataChart 只负责 图表生成和显示

      • 锅: 唯一职责就是煮菜。(对应 DBUtil 只负责 连接数据库

      • 铲子: 唯一职责就是翻炒。(对应 CustomerDAO 只负责 操作客户数据

    • 这样有什么好处?

      • 各司其职,专注高效: 菜刀只管切得又快又好,锅只管导热均匀,铲子只管翻炒到位。每个工具都专注于做好自己的那一件事。

      • 独立变化,互不影响: 想换把更锋利的菜刀?没问题!换锅?也没问题!换铲子?更没问题!换其中一个完全不影响其他工具的使用。(一个类只有一个引起它变化的原因

      • 方便组合和借用: 需要切菜?拿菜刀。需要炒菜?拿锅和铲子组合。想借铲子给邻居?只借铲子就行,不用把整个厨房搬过去。(高内聚,低耦合,易复用

      • 容易维护: 菜刀钝了,磨菜刀就行,不用动锅和铲子。

所以,单一职责原则 (SRP) 的核心思想就是:

  • 一个东西(类、模块、方法)只干好一件事。 👨‍🍳

  • 这件事应该有且只有一个理由让它发生变化。 🎯

  • 别让一个类变成“万能工具箱”,让它成为“专业工具”。 🔧

套用回你例子里的 CRM 系统:

  • 原来那个 CustomerDataChart 类就像瑞士军刀,它包揽了:

    • 连接数据库 (相当于开瓶器)

    • 查客户数据 (相当于剪刀)

    • 生成图表 (相当于主刀片)

    • 显示图表 (相当于锯子)

  • 这违反了 SRP,因为它干的事太多,变化原因也太多(数据库变了要改它,图表样式变了也要改它)。

  • 重构后:

    • DBUtil 只干一件事:连接数据库 (专职的“接线员”)

    • CustomerDAO 只干一件事:操作客户数据 (专职的“数据管理员”)

    • CustomerDataChart 只干一件事:处理图表 (专职的“画图师”)

总结成一句最通俗的话:

“一个类,就让它专心做好一件事,别让它身兼数职、操太多心,这样它才更可靠、更好用、更容易维护!” 💡

http://www.dtcms.com/a/275604.html

相关文章:

  • 注解驱动的知识中枢:MCPServer赋能AI业务的技术架构与实践
  • Mastercam 2026中文版网盘资源下载与安装教程共享
  • JAVA--双亲委派机制
  • 历史数据分析——云南白药
  • Matplotlib 全面使用指南 -- 紧密布局指南 Tight layout guide
  • Leetcode力扣解题记录--第3题(滑动窗口)
  • Python 实战:构建 Git 自动化助手
  • pgsql模板是什么?
  • 深入理解设计模式:建造者模式详解
  • AI产品经理面试宝典第12天:AI产品经理的思维与转型路径面试题与答法
  • 分音塔科技(BABEL Technology) 的公司背景、股权构成、产品类型及技术能力的全方位解读
  • LRU缓存机制完全实战:链表的工程落地与面试通关
  • 杭州乐湾科技有限公司的背景、产品体系与技术能力的全方位深度分析
  • [论文阅读] 人工智能 + 软件工程 | AI助力软件可解释性:从用户评论到自动生成需求与解释
  • 仅27M参数!SamOutVX轻量级语言模型刷新认知,小身材也有大智慧
  • 后端定时过期方案选型
  • 构建AI Agent的完整实战指南:从邮件助手案例看6步落地方法
  • SpringBoot整合Swagger2快速指南
  • Elasticsearch 线程池
  • nginx反向代理实现跨域请求
  • 从零到一:企业如何组建安全团队
  • Go语言高并发聊天室(二):WebSocket服务器实现
  • 白皮精读——2025医疗数据合规白皮书 【附全文阅读】
  • JVM 类加载过程
  • 5. JVM 的方法区
  • 云端docker小知识
  • Vue Vue-route (6)
  • 【SpringAI】7. 基于 milvus 的向量检索
  • Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
  • 个人面经250712