认识设计模式SOLID原则

在这里插入图片描述

SOLID 是一个缩写词,代表面向对象编程 (OOP) 的五个设计原则,旨在促进更简单、更健壮和可更新的代码。 SOLID 缩写中的每个字母都代表了开发易于维护和随时间扩展的软件的原则。

SOLID原则是面向对象编程和设计的五项基本指导原则,由罗伯特·C·马丁(Robert C. Martin)提出,用于帮助开发者构建更加健壮、可维护和可扩展的软件系统。SOLID是这五个原则首字母的缩写,分别代表:

单一职责原则(SRP):一个类只应承担一种责任。

开闭原则(OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。

里氏替换原则(LSP):所有派生类都应该能够替换其基类。

依赖倒置原则(DIP):高层模块不应该依赖低层模块;两者都应该依赖抽象。

接口隔离原则(ISP):不应该强迫客户依赖他们不使用的接口。

简写全称中文描述
SRPThe Single Responsibility Principle单一功能原则
OCPThe Open Closed Principle开放封闭原则(开闭原则)
LSPThe Liskov Substitution Principle里氏替换原则
DIPThe Dependency Inversion Principle依赖倒置原则
ISPThe Interface Segregation Principle接口分离原则
  1. 单一职责原则(Single Responsibility Principle, SRP)
  • 这个原则指出一个类或者模块应当只负责一项职责,即仅有一个引起它变化的原因。这样可以减少类之间的耦合,使得类更易于理解、测试和维护。

  • Example: Instead of a User class that handles both user data and password validation, separate the concerns into UserData and PasswordValidator classes.

  1. 开闭原则(Open/Closed Principle, OCP)
  • 开放封闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。也就是说,可以在不修改原有代码的基础上通过扩展来增加新的功能,从而支持软件的持续演进。
  • Example: Use inheritance or interfaces to add new functionality without modifying existing code. For instance, create a PaymentGateway interface and implement specific payment gateways like Stripe or PayPal without changing the underlying code.
  1. 里氏替换原则(Liskov Substitution Principle, LSP)
  • 里氏替换原则强调在面向对象设计中,子类应当能够替换其父类并且不会影响到程序的正确性。换言之,使用父类的地方能够透明地使用子类的对象,而不会引发错误或异常行为。

  • Example: A Square class that inherits from a Rectangle class should be able to be used as a Rectangle without affecting the correctness of the program.

  1. 依赖倒置原则(Dependency Inversion Principle, DIP)
  • 依赖倒置原则主张高层模块不应依赖于低层模块,二者都应该依赖于抽象。同时,抽象不应该依赖于细节,细节应当依赖于抽象。这通常通过依赖注入等方式实现,有助于降低耦合,提高灵活性。

  • Example: Instead of a Vehicle interface with multiple methods (e.g., drive(), fly(), sail()), create separate interfaces for each type of vehicle (e.g., Drivable, Flyable, Sailable).

  1. 接口隔离原则(Interface Segregation Principle, ISP)
  • 接口隔离原则提倡客户端不应被迫依赖它不需要的接口。应当将大型接口拆分为更小、更具体的接口,这样客户端只会看到它关心的方法,降低了耦合度。

  • Example: Use dependency injection to provide a Database abstraction to a UserService class, allowing you to switch from a MySQL database to a PostgreSQL database without changing the UserService code.

SOLID原则的应用

SOLID原则可以应用于各个层面的软件设计,从类设计到系统架构。遵循SOLID原则可以帮助开发人员设计出更易于维护、更灵活的软件。

Python
# 单一职责原则
class EmailSender:def send_email(self, recipient, subject, body):# 发送邮件的代码class SMSNotifier:def send_sms(self, phone_number, message):# 发送短信的代码# 开闭原则
class Shape:def draw(self):passclass Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef draw(self):# 绘制矩形的代码class Circle(Shape):def __init__(self, radius):self.radius = radiusdef draw(self):# 绘制圆形的代码# 里氏替换原则
class Animal:def make_sound(self):passclass Dog(Animal):def make_sound(self):print("汪汪汪")class Cat(Animal):def make_sound(self):print("喵喵喵")# 接口隔离原则
class IPaymentProcessor:def process_payment(self, amount):passclass CreditCardProcessor(IPaymentProcessor):def process_payment(self, amount):# 处理信用卡支付的代码class PayPalProcessor(IPaymentProcessor):def process_payment(self, amount):# 处理PayPal支付的代码# 依赖倒置原则
class OrderService:def __init__(self, payment_processor):self.payment_processor = payment_processordef place_order

遵循SOLID原则有助于提升代码的质量,使得软件更容易理解和维护,同时也为未来的修改和扩展打下了良好的基础。然而,在实际应用中,开发者需要根据项目的实际情况灵活运用这些原则,有时候过分追求遵循每一个原则可能会带来不必要的复杂度。

参考

  • 一文读懂SOLID原则
  • SOLID (面向对象设计)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用HAL库改写江科大的stm32入门例子_9-1 串口发送

设置串口: 选项说明: 写一个串口发送函数: // serial send string function void serial_send_string(char *str) {HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 1000); } main函数中调用发送信息: uint8_t dat…

极致设计!详解专业网页设计的全套步骤和流程

在当今的数字时代,拥有一个专业、易于使用和有吸引力的网页对任何企业或个人都至关重要。专业的网页设计是实现这一目标的关键步骤之一。本文将详细介绍专业的网页设计步骤和过程,以帮助您了解如何设计一个优秀的网页。 在介绍专业网页设计步骤和流程之…

GPU术语

SP(Streaming Processor)流处理器 流处理器是GPU最基本的处理单元,在fermi架构开始被叫做CUDA core。 SM(Streaming MultiProcessor) 一个SM由多个CUDA core组成。SM还包括特殊运算单元(SFU),共享内存(shared memory),寄存器文件(Register …

使用idea管理docker

写在前面 其实idea也提供了docker的管理功能,比如查看容器列表,启动容器,停止容器等,本文来看下如何管理本地的docker daemon和远程的dockers daemon。 1:管理本地 双击shift,录入service: …

C++算法题 - 二叉树层次遍历

目录 199. 二叉树的右视图637. 二叉树的层平均值102. 二叉树的层序遍历103. 二叉树的锯齿形层序遍历 199. 二叉树的右视图 LeetCode_link 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节…

Java性能优化(一):Java基础-ArrayList和LinkedList

引言 集合作为一种存储数据的容器,是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型,这些集合类型使用不同的数据结构来实现。因此,不同的集合类型,使用场景也不同。 很多同学在面试的时候&#x…

自刷广告变现,APP收益如何提高

广告变现,是许多APP开发者和运营者追求的目标。然而,对于一些新手来说,如何进行广告变现,特别是如何去自刷广告变现,却是一个让人头疼的问题。实际上,只要在平台的规则内操作,自刷广告也是可以进…

Colibri for Mac v2.2.0激活版:专业级无损音乐播放器

Colibri for Mac是一款专为Mac用户设计的高分辨率无损音乐播放器。它基于BASS技术构建,为用户带来极致的音频体验。Colibri支持所有流行的无损和有损音频格式,如FLAC、MP3、AAC等,确保音乐播放的清晰度和完美度。其独特的清晰比特完美播放技术…

Android内核之Binder通信写操作:binder_thread_write用法实例(七十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

终端安全管理措施有哪些?好用终端安全管理软件推荐(建议收藏)

在当今数字化时代,信息安全已成为企业运营不可或缺的一部分。其中,终端安全为您详细介绍,并推荐几款好用的终端安全管理软件,帮助您更好地保护企业信息安全。管理是确保企业信息安全的重要环节。那么,终端安全管理措施…

Kettle连接Mysql数据库时报错——Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found

一、问题描述 当我们使用ETL工具Kettle需要连接Mysql数据库进行数据清洗操作,在配置好Mysql的连接串内容后,点击【测试】按钮时报错【错误连接数据库 [MysqlTestConnection] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to conne…

搭建Springboot的基础开发框架-01

本系列专题虽然是按教学的深度来定稿的,但在项目结构和代码组织方面是按公司系统的要求来书定的。在本章中主要介绍下基础开发框架的功能。后续所有章节的项目全是在本基础框架的基础上演进的。 工程结构介绍 SpringbootSeries:父工程,定义一…

MyBatis高级扩展

五、MyBatis高级扩展 5.1 Mapper批量映射优化 需求Mapper 配置文件很多时&#xff0c;在全局配置文件中一个一个注册太麻烦&#xff0c;希望有一个办法能够一劳永逸。 配置方式Mybatis 允许在指定 Mapper 映射文件时&#xff0c;只指定其所在的包&#xff1a; <mappers&…

SystemVerilog/Verilog中的仿真延时建模之门延时

提到门延时,就必须重提分布延迟。 分布延迟指模块内信号从(逻辑门的输入到输出)或者(线网的延迟)。这里虽然简短一句话,却涵盖非常大的信息量。 一 门延迟种类 今天我们着重看门延迟。常见门延迟主要有三种: 注意!:如果信号从0/1/z变化到x,那么此时的门传输延迟为上…

C语言 函数概述

好 接下来 我们来讲函数 构建C程序的最佳方式 就是模块化程序设计 C语言中 最基本的程序模块被称为 函数 所以 这个知识点的重要性不言而喻 这里 我们讲个故事 诸葛亮六出祁山时 为了逼司马懿出战 派人送给力司马懿一件女人衣服 司马懿只是为使者 诸葛亮的饮食起居 使者感叹…

AI绘图神器!InstantStyle保留风格进行文本到图像生成

在今天的数字化时代&#xff0c;我们可以看到AI技术的应用已经渗透到生活的各个角落&#xff0c;尤其是在视觉艺术领域。最近&#xff0c;一个名为InstantStyle的全新框架引起了广泛关注&#xff0c;它是一个创新的文本到图像生成框架&#xff0c;其核心功能在于能够有效地分离…

【JVM】类加载机制及双亲委派模型

目录 一、类加载过程 1. 加载 2. 连接 a. 验证 b. 准备 c. 解析 3. 初始化 二、双亲委派模型 类加载器 双亲委派模型的工作过程 双亲委派模型的优点 一、类加载过程 JVM的类加载机制是JVM在运行时&#xff0c;将 .class 文件加载到内存中并转换为Java类的过程。它…

全面升级企业网络安全 迈入SASE新时代

随着数字化业务、云计算、物联网和人工智能等技术的飞速发展&#xff0c;企业的业务部署环境日渐多样化&#xff0c;企业数据的存储由传统的数据中心向云端和SaaS迁移。远程移动设备办公模式的普及&#xff0c;企业多分支机构的加速设立&#xff0c;也使得企业业务系统的用户范…

神器:jQuery一键转换为纯净JavaScript代码

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 该工具将 jQuery 代码转换为现代、高效的 JavaScript。它允许您用纯 JavaScript 替换 jQuery&#xff0c;同时保持原始代码不变。 虽然 jQuery 一直是 Web 开发中…

【自动驾驶|毫米波雷达】初识毫米波雷达射频前端硬件

第一次更新&#xff1a;2024/5/4 目录 整体概述 混频器&#xff08;MIXER&#xff09; 低通滤波器&#xff08;LPF&#xff1a;Low-Pass filter&#xff09; 数模转换器&#xff08;ADC&#xff1a;Analog to Digital Converter&#xff09; 毫米波雷达功能框图 整体概述 完…