【面向对象设计原则】SOLID

news/2024/11/29 6:30:35/

单一职责原则(Single Responsibility Principle,SRP)

描述

There should never be more than one reason for a class to change。仅有一种原因引起类的改变。一个类只负责一个职责

特点

  1. 一个类负责一个单一职责,避免职责上的交叉实现
  2. 保证面向接口实现

参考

SRP

开放封闭原则(Open Closed Principle,OCP)

描述

新需求来临时,通过新增类实现,而不是修改已有类

特点

  1. 开放:对于扩展开放;封闭:对于更改封闭
  2. 任何类都不应该从具体类派生
  3. 代码实现初期,尽量抽象代码以隔绝变化
  4. 代码实现中期,尽量不改变已有代码,而是增加新的代码面对变化

参考

OCP

里氏替换原则(Liskov Substitution Principle,LSP)

描述

父类能出现的地方,可以直接用其子类替代

实现标准

  1. 子类必须完全实现父类的抽象方法,但不能覆盖父类的非抽象方法

  2. 子类可以实现自己特有的方法

  3. 当子类覆盖或实现父类的方法时,方法的前置条件(输入形参)要比父类方法的输入更宽松

    即父类接受参数类型为xx,则子类的参数类型应该比父类更宽松,可以是xx也可以是yy,即子类可以处理更多类型的输入参数

  4. 当子类的方法实现父类的抽象方法时,方法的后置条件(返回值)要比父类更加严格

    即父类的返回值类型为xx,则子类的返回值类型应该比父类更严格,可以是xx,或者是xx的子类,即子类的返回值类型需要更加具体,返回的结果应该是父类返回结果的子类

参考

后边再找

接口分离原则(Interface Segregation Principle,ISP)

描述

使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖哪些他不需要的接口

实现标准

  1. 每个类尽量提供接口或者抽象类,或者两者都具备
  2. 变量的声明类型尽量是接口或者抽象类
  3. 任何类都不应该从具体类派生
  4. 使用继承时尽量遵循里氏替换原则

参考

ISP

依赖倒置原则(Dependency Inversion Principle,DIP)

描述

  1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象
  2. 抽象不应该依赖细节,细节应该依赖抽象
  3. 核心思想:要面向接口变成,而不是面向实现编程

实例

from abc import ABC, abstractmethod# 定义一个抽象类作为低层模块的抽象
class DataStorage(ABC):@abstractmethoddef read_data(self):pass@abstractmethoddef write_data(self, data):pass# 低层模块的具体实现
class FileStorage(DataStorage):def read_data(self):print("Reading data from file")# 具体的读取文件的实现def write_data(self, data):print("Writing data to file")# 具体的写入文件的实现# 高层模块依赖于低层模块的抽象接口
class DataManager:def __init__(self, storage: DataStorage):self.storage = storagedef process_data(self):data = self.storage.read_data()# 对数据进行处理processed_data = self._process_data(data)self.storage.write_data(processed_data)def _process_data(self, data):# 数据处理的具体实现pass# 创建低层模块的实例
file_storage = FileStorage()# 创建高层模块的实例,并传入低层模块的实例
data_manager = DataManager(file_storage)# 调用高层模块的方法进行数据处理
data_manager.process_data()

通过这样的设计,高层模块DataManager不依赖于低层模块FileStorage的具体实现,而是依赖于抽象接口DataStorage

最少知识原则(Least Knowledge Principle,LKP)

描述

  1. 从依赖者角度,只依赖应该依赖的对象
  2. 从被依赖者角度,只暴漏应该暴漏的方法

优点

  1. 降低了类之间的耦合度,提高了模块的相对独立性
  2. 由于亲和度降低,从而提高了类的可复用率和系统的扩展性

参考

LKP


http://www.ppmy.cn/news/234516.html

相关文章

C语言7:输入若干个学生的成绩,统计出平均成绩

在程序编辑区编写程序,给定程序功能是: 从键盘上输入若干个学生的成绩,统计出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。 例如输入: 70 80 90 -1 输出: ave 80.00 --------OUTPUT----------- 70.0 程序有…

「HTML和CSS入门指南」td 标签详解

什么是 td 标签? 在 HTML 中,td 标签用于创建表格中的普通单元格。每个单元格都包含了一个数据值,可以包含文本、图像、链接等内容。 td 标签的基本语法 以下是 td 标签的基本语法: <table><tr><td>单元格1</td><td>单元格2</td><…

逍遥自在学C语言 | for循环详解

前言 C语言中的循环结构时&#xff0c;for循环是最常用的一种。它允许重复执行一段代码&#xff0c;直到满足特定条件为止。 本文将详细介绍for循环的用法&#xff0c;并提供相关的可编译运行的C代码示例。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语…

联想win11无线鼠标连接不上

问题&#xff1a;充了电,无法连接上 解决:将壳中的电池拿下来&#xff0c;重装一下就好(注意别装反了&#xff01;)

联想小新笔记本关机后鼠标灯仍保持常亮解决方法

开机时按F2Fn按键进入bios 界面/F10也可以进入&#xff0c;F10 按住后选择setup即可。 配置界面 将低功耗模式下持续给usb设备供电选项关闭&#xff0c;设置为disable 即可

联想小新3.0蓝牙鼠标连接win10系统

等待前蓝灯快速闪在放松。 蓝灯灭。

联想E14笔记本 不插鼠标出现鼠标自动漂移乱串

环境&#xff1a; 电脑&#xff1a;联想 ThinkPad E14 系统&#xff1a;Windows 10 专业版 64位 问题描述&#xff1a; 联想E14 不插鼠标出现鼠标自动漂移乱串 解决方案&#xff1a; 1.安装最新触控面板驱动&#xff08;未解决&#xff09; 2.卸载停用触控面板&#xff…

联想拯救者Y7000P鼠标卡顿问题(已解决)

方法一&#xff1a;默认是混合显卡模式&#xff0c;切换独立显卡&#xff0c;完了记得要应用。切换之后&#xff0c;帧率也上去了&#xff0c;香得不要不要的 方法二&#xff1a; 网上说是联想管理软件安装了一些自己的服务导致的问题。 禁用system interface foundation servi…