认识设计模式SOLID原则

2024-05-09 05:44

本文主要是介绍认识设计模式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 (面向对象设计)

这篇关于认识设计模式SOLID原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972541

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

漫谈设计模式 [12]:模板方法模式

引导性开场 菜鸟:老大,我最近在做一个项目,遇到了点麻烦。我们有很多相似的操作流程,但每个流程的细节又有些不同。我写了很多重复的代码,感觉很乱。你有啥好办法吗? 老鸟:嗯,听起来你遇到了典型的代码复用和维护问题。你有没有听说过“模板方法模式”? 菜鸟:模板方法模式?没听过。这是什么? 老鸟:简单来说,模板方法模式让你在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。这样,你可

漫谈设计模式 [9]:外观模式

引导性开场 菜鸟:老鸟,我最近在做一个项目,感觉代码越来越复杂,我都快看不懂了。尤其是有好几个子系统,它们之间的调用关系让我头疼。 老鸟:复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你的代码结构? 菜鸟:设计模式?我听说过一些,但不太了解。你觉得我应该用哪个模式呢? 老鸟:听起来你的问题可能适合用**外观模式(Facade Pattern)**来解决。我们可以一起探讨一下。

SpringMVC-1.认识及配置

SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。 MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视