认识设计模式SOLID原则

news2024/11/15 11:00:43

在这里插入图片描述

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):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def draw(self):
        # 绘制矩形的代码

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def draw(self):
        # 绘制圆形的代码

# 里氏替换原则
class Animal:
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        print("汪汪汪")

class Cat(Animal):
    def make_sound(self):
        print("喵喵喵")

# 接口隔离原则
class IPaymentProcessor:
    def process_payment(self, amount):
        pass

class 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_processor

    def place_order

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

参考

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

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

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

相关文章

一、Prometheus介绍及部署

目录 一、什么是Prometheus? 二、特点 三、prometheus 的生态组件: 四、Prometheus架构图 五、prometheus 的工作模式 六、Prometheus 的工作流程 七、部署Prometheus 1、prometheus配置文件介绍 2、配置文件详解 3、配置systemd服务 用systemct…

联合有爱,光照未来

随着社会的进步和人们生活水平的提高,越来越多的家庭开始关注儿童的成长和教育。然而,仍有部分地区的儿童因资源匮乏、经济困难等原因,面临着生活和学习上的种种挑战。为了传递社会的温暖和关爱,改善有实际困难的学校及学生的学习…

Verilog_学习路线(小白)

#前言: 自从专心学习专业课后,发现知识点得用,越用越熟练,工具也一样,高级工具的学习可帮助我们在工作中极大地提高效率,但这里要记住一点,任何工具都是为解决实际问题出现的,即落脚…

uniapp音乐播放整理

一、前置知识点 1.1 音频组件控制-uni.createInnerAudioContext() 创建并返回内部 audio 上下文 innerAudioContext 对象。 主要用于当前音乐播放; 1.1.1 innerAudioContext属性 属性类型说明只读平台差异说明srcString音频的数据链接,用于直接播放…

Milvus Cloud:打造向量数据库的Airtable级体验

向量数据库Milvus Cloud是一种用于处理和存储向量数据的数据库,它通常用于机器学习、图像和视频检索、自然语言处理等领域。要将其升级为类似Airtable那样易用且一体化的系统,需要考虑以下几个关键方面: 1. 用户界面(UI)设计 Airtable之所以用户友好,很大程度上归功于其直…

Java 日期类 API

1. jdk8 之前的日期 API 1.1. System 类 currentTimeMillis(); Test public void test1() { long timeMillis System.currentTimeMillis(); System.out.println("timeMillis " timeMillis); }1.2. java.util.Date 和 java.sql.Date java.sql.Date 是 jav…

vue2项目升级到vue3经历分享5

写到第5篇了,解决了很多问题,还有一些需要调整 1 el-input-number指令兼容性调整 下面这个可编辑的表格,全是0,于是需要一个指令,让它自己实现如果是0,就置空;如果是数字就是格式化为千分位&…

男士内裤哪个品牌好穿?男士内裤品牌测评推荐,干货满满

随着时代的进步和发展,男士内裤现在普遍分为三角、平角、四角的三个大类,不过大多数男性朋友都是穿平角四角为主。虽然男士内裤款式众多,但大部分男同胞每一条内裤都是穿非常久的,实际上男士内裤需要定期更换才能保持更换的舒适性…

《十日终焉》中的定律整理-向虫队学习(举例+持续更新)

1、二八定律 二八定律,又称帕累托法则,也叫巴莱多定律。 是19世纪末20世纪初意大利经济学家巴莱多发明的。其中指出,约仅有20%的因素影响80%的结果。也就是说:所有变因中,最重要的仅有20%,虽然剩余的80%占…

第二证券今日投资参考:银保渠道合作限制松绑 低空旅游借势起飞

昨日,两市股指盘中震动上扬,沪指一度涨近1%续创年内新高,创业板指一度涨超2%。到收盘,沪指涨0.83%报3154.32点,深证成指涨1.55%报9788.07点,创业板指涨1.87%报1900.01点,科创50指数涨2.26%&…

如何让组织充满活力?你需要做好这七步

组织活力,通俗点说就是: 从竞争对手角度看,组织活力强的组织能做到竞争对手做不到的事情; 从客户角度看,组织活力强的组织,客户感受好; 从员工角度看,组织活力强的组织&#xff0c…

【速看】软考架构考前复习20问!你能答出多少?

马上就要进行今年的软考了,大家都准备得怎么样了呢,2024上半年的软考架构得分点你知道了吗? 目标不光是把历年母题的考点规律吃透,还要规划好各类题型的做题时间,除了纸质版还要上机模拟,更好的适应机考&am…

将java项目上传到GitHub步骤

文章目录 一、GitHub 作用二、github如何修改默认分支为master三、手把手教你把项目上传github上四、github怎么删除仓库或项目五、github配置ssh key密钥的步骤六、执行到push时报错的解决办法七、github怎么修改仓库语言 一、GitHub 作用 GitHub 是一个存放软件代码的网站&a…

上海计算机学会2023年9月月赛C++丙组T2Z形填充

题目描述 给定一个整数 n,再给定 n2 个字符,请将这些字符以 z 形排成一个 nn 的矩阵。 z 形的定义是,第一个字符在左上角,然后沿对角线以 z 形放置字符。对于 n4 ,z 形排列的先后顺序标记如下: 输入格式 …

基于Spring Boot的网页即时聊天系统

目录 一、系统总体功能设计 二、开发工具及环境 三、前台系统主要功能实现界面展示 1.登入模块 2.主页模块 3.好友设置模块 4.好友动态模块 5.个人中心模块 6.好友设置详情 7.视频通话 8.语音通话 9.对消息操作 四、后台系统主要功能实现界面展示 1.登入模块 2.后…

Git 分支命令操作详解

目录 1、分支的特点 2、分支常用操作 3、分支的使用 3.1、查看分支 3.2、创建分支 3.3、修改分支 3.4、切换分支 3.5、合并分支 3.6、产生冲突 3.7、解决冲突 3.8、创建分支和切换分支说明 1、分支的特点 同时并行推进多个功能开发,提高开发效率。各个分…

show profile

功能 当你执行一个复杂的 SQL 查询时,这个命令可以帮助你了解查询的各个部分花费了多少时间,从而找到可能的性能瓶颈。默认情况下,参数处于关闭状态,并保存最近15次的运行结果 开启 查看是否支持 SHOW VARIABLES LIKE profili…

如何给文件和文件夹添加备注信息

1. 给文件添加备注信息 1. 打开文件夹,点击查看 → 选项 → 更改文件夹和搜索选项 → 勾除隐藏受保护的操作系统文件 → 勾选显示隐藏的文件、文件夹和驱动器; 2. listary工具搜索desktop.ini,随便点击一个desktop.ini文件,即可…

Java String转JSONObject时保持字段顺序不变

Java String转JSONObject时保持字段顺序不变 问题背景解决方案 问题背景 在业务接口开发过程中,有一个新增接口,需要支持批量新增数据,这时入参就需要用到 json 格式数据,且包含 list 集合,比如这样的数据格式&#x…

ZeptoMail邮箱API发送邮件的参数如何配置?

ZeptoMail邮箱API发送邮件的步骤?怎么使用API接口? 在使用ZeptoMail邮箱API发送邮件时,正确的参数配置是确保邮件能够成功发送的关键。下面,AokSend将详细介绍如何配置ZeptoMail邮箱API发送邮件的参数。 ZeptoMail邮箱API发送邮…