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

设计模式-原则概述

原则概述

单一职责原则简述

单一职责原则(Single Responsibility Principle, SRP)是面向对象设计中的一个重要原则,它要求一个类应该只有一个原因引起变化,即一个类应该只有一个职责。遵循这一原则可以提高代码的可读性、可维护性和可扩展性。

原则说明

  • 每个类应该只负责一个功能或职责。
  • 如果一个类承担了多个职责,当其中一个职责发生变化时,可能会影响到其他职责,从而导致代码的脆弱性。

优点

  • 提高可维护性:每个类的功能单一,修改时影响范围小。
  • 增强可读性:类的职责清晰,便于理解。
  • 便于测试:单一职责的类更容易进行单元测试。

缺点

  • 类的数量增加:可能导致类的数量增多,增加系统的复杂性。
  • 初期设计复杂:在设计时需要考虑职责划分,可能增加初期的设计成本。

开放-封闭原则简述

开放-封闭原则(Open/Closed Principle, OCP)是面向对象设计中的一个重要原则,旨在提高软件的可扩展性和可维护性。该原则规定:软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着在不修改现有代码的情况下,可以通过添加新代码来扩展系统的功能。

原则说明

  • 对扩展开放:可以通过新类或新模块来扩展功能。
  • 对修改封闭:现有的代码不应该被修改,以避免引入新的错误。

优点

  • 提高系统的灵活性:可以轻松添加新功能而不影响现有功能。
  • 降低系统的风险:减少对现有代码的修改,降低引入错误的可能性。
  • 增强可维护性:代码结构更清晰,便于理解和维护。

缺点

  • 设计复杂性增加:需要在初期设计时考虑扩展性,可能增加设计的复杂性。
  • 类的数量增加:为了遵循该原则,可能需要创建更多的类,导致系统复杂性提高。

里氏替换原则简述

里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计中的一个重要原则,旨在确保子类可以替换父类而不影响程序的正确性。换句话说,如果一个程序使用父类的对象,那么它也应该能够使用任何子类的对象,而不需要知道它们的具体类型。

原则说明

  • 子类对象应该能够替换父类对象。
  • 子类不应破坏父类的功能或合同。

优点

  • 提高代码的可重用性:遵循该原则的代码更容易重用,因为可以通过替换不同的子类来实现多态。
  • 增强代码的可维护性:代码结构更清晰,便于理解和维护。

缺点

  • 设计复杂性增加:需要在设计时考虑子类与父类之间的关系,可能增加设计的复杂性。
  • 可能导致继承层次过深:过多的继承可能导致系统复杂性增加。

依赖倒转原则简述

依赖倒转原则(Dependency Inversion Principle, DIP)是面向对象设计中的一个重要原则,它强调高层模块不应该依赖低层模块,而是应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。换句话说,程序中的依赖关系应该通过接口或抽象类来实现,而不是通过具体实现类。

原则说明

  • 高层模块不应依赖于低层模块,二者都应依赖于抽象。
  • 抽象不应依赖于细节,细节应依赖于抽象。

优点

  • 提高系统的灵活性和可扩展性:可以轻松替换具体实现而不影响高层模块。
  • 降低模块之间的耦合度:通过接口或抽象类降低模块之间的依赖关系,提高代码的可维护性。

缺点

  • 设计复杂性增加:需要在设计时考虑抽象和接口的使用,可能增加设计的复杂性。
  • 初期开发成本增加:为了遵循该原则,可能需要额外的接口和抽象类,增加初期开发的工作量。

迪米特法则简述

迪米特法则(Law of Demeter),也称为最少知识原则,是一种设计原则,旨在减少系统中各个模块之间的耦合。该法则规定一个对象应该对其他对象有尽可能少的了解。具体来说,一个对象只应该与直接的朋友进行交互,而不应该了解其他对象的内部细节

主要原则

  1. 一个对象应该只与其直接的朋友交互。
  2. 不应该与陌生人通信。
  3. 避免通过链式调用来访问对象的属性。

优点

  • 降低耦合:通过减少对象之间的依赖关系,降低了系统的耦合度。
  • 增强可维护性:系统的模块之间的依赖关系减少后,代码的可维护性和可读性提高。

缺点

  • 可能导致过度封装:在某些情况下,过度遵循迪米特法则可能导致代码的复杂性增加。
  • 影响性能:在某些场景下,过多的对象交互可能会影响性能。

合成/聚合复用原则简述

合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)是面向对象设计中的一项重要原则,旨在提高代码的复用性。该原则强调在设计类时,应该优先使用合成(Composition)或聚合(Aggregation)关系,而不是继承(Inheritance)关系,以实现更灵活和可维护的系统。

角色

  • 合成(Composition):一种强关系,表示整体与部分之间的关系,部分不能独立于整体存在。
  • 聚合(Aggregation):一种弱关系,表示整体与部分之间的关系,部分可以独立于整体存在。

优点

  • 灵活性:通过合成或聚合,可以在运行时动态地改变组成部分,增强了系统的灵活性。
  • 可重用性:不同的类可以共享相同的组件,减少了代码重复,提高了复用性。
  • 降低耦合:合成和聚合关系通常比继承关系耦合度低,便于维护和扩展。

缺点

  • 设计复杂性:使用合成或聚合可能会增加设计的复杂性,特别是在需要管理多个组件时。
  • 性能开销:在某些情况下,合成和聚合可能引入额外的性能开销。

文章转载自:

http://XXNXO6x6.xhLpn.cn
http://CEksLukm.xhLpn.cn
http://E9ILxMrt.xhLpn.cn
http://7yXCtBpm.xhLpn.cn
http://DJjhqXKz.xhLpn.cn
http://8pQoJ28C.xhLpn.cn
http://3YwHIbGk.xhLpn.cn
http://P0RxSybL.xhLpn.cn
http://kr5X7Owh.xhLpn.cn
http://pX7kId4E.xhLpn.cn
http://ItSY4cEA.xhLpn.cn
http://jtfkBxxG.xhLpn.cn
http://DWddyjjM.xhLpn.cn
http://l2CfaCnU.xhLpn.cn
http://bljaVfPA.xhLpn.cn
http://kSuZIwMB.xhLpn.cn
http://Mn6os0wG.xhLpn.cn
http://UGds6Tuo.xhLpn.cn
http://Ip2ocNvt.xhLpn.cn
http://GAS1Dbp3.xhLpn.cn
http://9s8FpYFG.xhLpn.cn
http://SgF6TLjq.xhLpn.cn
http://ewHrGJfr.xhLpn.cn
http://D52mfNqy.xhLpn.cn
http://JSyvhgMI.xhLpn.cn
http://niHBs7YQ.xhLpn.cn
http://CvJ6ikqh.xhLpn.cn
http://zdCDxHBM.xhLpn.cn
http://S9F3GfED.xhLpn.cn
http://Ip9kwBO5.xhLpn.cn
http://www.dtcms.com/a/375303.html

相关文章:

  • LAMPSecurity: CTF8靶场渗透
  • python网络爬取个人学习指南-(五)
  • CSS 基础概念
  • 在企业内部分发 iOS App 时如何生成并使用 manifest.plist
  • AJAX入门-AJAX 概念和 axios 使用
  • 框架-MyBatis|Plus-1
  • Spring Boot 2.7 启动流程详解
  • springboot框架使用websocket实现一个聊天室的细节
  • Kubernetes集群部署Jenkins指南
  • 027、全球数据库市场深度分析:技术革命下的产业格局重塑
  • 贪心算法与动态规划:数学原理、实现与优化
  • Oracle APEX 利用卡片实现翻转(方法二)
  • 记一次 electron 添加 检测 终端编码,解决终端打印中文乱码问题
  • 从生活照料到精神关怀,七彩喜打造全场景养老服务体系
  • 2025-09-08升级问题记录: 升级SDK从Android11到Android12
  • BizDevOps 是什么?如何建设企业 BizDevOps 体系
  • 一、ARM异常等级及切换
  • 【项目复现】MOOSE-Chem 用于重新发现未见化学科学假说的大型语言模型
  • mybatis plus 使用wrapper输出SQL
  • PgSQL中优化术语HOT详解
  • Python 绘制 2025年 9~11月 P/1999 RO28 (LONEOS) 彗星路径
  • Spring Cloud Stream深度实战:发布订阅模式解决微服务通信难题
  • 【菜狗每日记录】深度轨迹聚类算法、GRU门控神经网络—20250909
  • OpenCV 实战:多角度模板匹配实现图像目标精准定位
  • C#/.NET/.NET Core技术前沿周刊 | 第 53 期(2025年9.1-9.7)
  • 基于Java+Vue开发的家政服务系统源码适配H5小程序APP
  • 使用Flask实现接口回调地址
  • Java线程中的sleep、wait和block:区别与联系详解
  • 生信软件管理, 容器-Singularity学习笔记
  • go webrtc - 2 webrtc重要概念