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

设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

设计原则

    • 单一职责原则(SRP)
      • 从三大特性角度看原则:
      • 应用的设计模式:
    • 开放封闭原则(OCP)
      • 从三大特性角度看原则:
      • 应用的设计模式:
    • 里氏替换原则(LSP)
      • 从三大特性角度看原则:
      • 应用的设计模式:
    • 依赖倒置原则(DIP)
      • 从三大特性角度看原则:
      • 应用的设计模式:
    • 接口隔离原则(ISP)
      • 从三大特性角度看原则:
      • 应用的设计模式:
    • 迪米特法则(LoD)
      • 从三大特性角度看原则:
      • 应用的设计模式:

单一职责原则(SRP)

高内聚低耦合为程序设计原则,确保一个类或方法只负责单一功能或职责,避免代码耦合度高问题,提高代码的可维护性和可读性。

从三大特性角度看原则:

封装:将一个类的职责限制在一个范围内避免代码重复和混乱
继承:确保基类以及派生类都只需要专注于一个功能

应用的设计模式:

工厂模式中将对象的创建和使用分离开来,符合单一职责原则的要求。
代理模式中为其他对象提供一种代理以控制对这个对象的访问,并将代理对象和被代理对象分别负责自己的职责。
观察者模式中定义了一种一对多的依赖关系,当一个对象发生改变时,所有依赖它的对象都会得到通知,各自负责自己的职责。
装饰器模式中动态地给对象添加一些额外的职责,而不影响这个对象的其他职责。
策略模式中定义一系列算法,将它们封装起来,并且使它们可以相互替换,每个算法实现一个单一的职责。

开放封闭原则(OCP)

对修改关闭对扩展开放,通过抽象化和接口定义提供可扩展性,同时避免对原有代码的大规模修改。

从三大特性角度看原则:

多态: 通过抽象来实现多态可以使不同的实现有共同的接口,从而使得代码更具可扩展性。
封装:可以促进封装将代码封装在类中可以使得代码更加稳定,并且使得变化更容易管理。

应用的设计模式:

模板方法模式:定义一个操作中的算法的骨架,将一些步骤延迟到子类中实现。通过在父类中定义抽象方法或钩子函数,来让子类实现具体的功能,从而避免了对原有代码的修改。
策略模式:定义一系列算法,将它们分别封装起来,并且使它们可以相互替换。通过封装算法,我们可以在不修改原有代码的情况下增加新的算法实现,从而实现了对扩展的开放。
装饰器模式:动态地给一个对象添加一些额外的职责,而不改变其结构。通过在不改变原有代码的情况下,增加新的装饰器类来扩展对象的功能,从而实现了对扩展的开放。
观察者模式:定义了一种一对多的依赖关系,当一个对象发生改变时,所有依赖它的对象都会得到通知。通过将被观察者和观察者分离开来,我们可以在不修改原有代码的情况下增加新的观察者类,从而实现了对扩展的开放。

里氏替换原则(LSP)

保证子类可以替换父类并且不改变程序的正确性,提高系统的可扩展性和可维护性。

从三大特性角度看原则:

多态:通过接口抽象实现多态,从而增加程序的灵活性。
继承:确保了派生类可以完全取代基类,并且可以提高代码重用性。

应用的设计模式:

工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类。通过将对象的创建过程交给子类来完成,我们可以保证在父类和子类之间的同步性,从而遵循了里氏替换原则。
策略模式:定义一系列算法,将它们分别封装起来,并且使它们可以相互替换。通过将策略抽象成一个接口,不同的子类可以根据自己的需求来实现该接口,从而遵循了里氏替换原则。
模板方法模式:定义一个操作中的算法的骨架,将一些步骤延迟到子类中实现。通过在父类中定义抽象方法或钩子函数,让子类实现具体的功能,从而遵循了里氏替换原则。
适配器模式:将一个类的接口转换成客户希望的另外一个接口。通过适配器类来实现原有接口和目标接口之间的适配,从而遵循了里氏替换原则。

依赖倒置原则(DIP)

通过接口定义降低模块间的耦合度,提高系统的可重用性、可扩展性和可维护性。

从三大特性角度看原则:

多态与封装:通过使用接口或者抽象类,高层次模块可以从底层实现中分离出来,并且只与其抽象接口通信。

应用的设计模式:

工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类。通过将对象的创建过程交给子类来完成,并且使用工厂接口来代替具体的实现类,从而实现了依赖倒置原则。
抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。通过使用抽象工厂接口和抽象产品接口来代替具体的实现类,从而实现了依赖倒置原则。
依赖注入模式:通过构造函数、Setter方法或接口注入的方式,将具体的实现类注入到使用它的类中。通过这种方式,我们可以将具体实现类的创建和使用分离开来,并且使用接口或抽象类来进行编程,从而实现了依赖倒置原则。
模板方法模式:定义一个操作中的算法的骨架,将一些步骤延迟到子类中实现。通过在父类中定义抽象方法或钩子函数,让子类实现具体的功能,并且使用接口或抽象类来进行编程,从而实现了依赖倒置原则。

接口隔离原则(ISP)

尽可能将接口拆分为小而专业的部分,防止客户端依赖过多不必要的接口,提高代码的可读性和可维护性。

从三大特性角度看原则:

多态:使用抽象接口使得代码更加灵活,并且可以避免过度依赖某些具体实现的问题。
封装:将接口拆分成小的、专注的接口可以降低程序复杂性。

应用的设计模式:

适配器模式:将一个类的接口转换成客户希望的另外一个接口。通过使用适配器模式,我们可以将一个大而全的接口拆分成多个小而专注的接口,从而实现了接口隔离原则。
外观模式:为子系统提供一个单独的入口点,并且隐藏其内部的实现细节。通过定义一个高层次的接口来代表子系统的功能,在具体实现时,只需要实现这个高层次的接口即可,从而实现了接口隔离原则。
策略模式:定义一系列算法,将它们封装起来,并且使它们可以相互替换。通过将每种算法都抽象成一个接口,不同的策略类可以根据自己的需求来实现该接口,从而实现了接口隔离原则。
命令模式:将请求封装成一个对象,并且使得可以用不同的请求来参数化其他对象。通过将每种请求都抽象成一个接口,不同的命令类可以根据自己的需求来实现该接口,从而实现了接口隔离原则。

迪米特法则(LoD)

一个对象应该对其他对象有尽可能少的了解,降低系统的耦合度,提高系统的可维护性和可扩展性。

从三大特性角度看原则:

封装与多态:将实现细节和依赖关系隐藏起来,使系统更加稳定可维护,并可扩展性。

应用的设计模式:

中介者模式:定义一个中介对象来封装一系列的对象交互。通过将对象之间的通信转移给中介者处理,避免了对象之间的直接交互,从而实现了迪米特法则。
外观模式:为子系统提供一个单独的入口点,并且隐藏其内部的实现细节。通过在客户端与子系统之间增加一个外观对象,可以使得客户端只需要和外观对象进行交互,而不需要了解子系统的具体实现,从而实现了迪米特法则。
享元模式:运用共享技术来减少对象的创建数量,从而提高系统的性能。通过将公共部分抽象成享元对象,在多个对象之间共享这些对象,从而减少了对象之间的依赖关系,从而实现了迪米特法则。
观察者模式:定义一种一对多的依赖关系,当一个对象发生改变时,所有依赖它的对象都会得到通知。通过将被观察者和观察者分离开来,避免了对象之间的直接交互,从而实现了迪米特法则。

相关文章:

设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

设计原则单一职责原则(SRP)从三大特性角度看原则:应用的设计模式:开放封闭原则(OCP)从三大特性角度看原则:应用的设计模式:里氏替换原则(LSP)从三大特性角度看原则:应用的设计模式:依赖倒置原则(DIP)从三大特性角度看原则:应用的设计模式&…...

好像模拟了一个引力场

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 做一个网络让输入只有3个节点,每个训练集里有4张图片,让B的训练集全为0,排列组合A,观察迭代次数平均值的变化。 A-B 迭代次数 0 1 0 2*0*0*7-0*0*0*0 12957.31 0 0 0 2*0*0*7-0*0…...

MySQL优化——Explain分析执行计划详解

文章目录前言一. 查看SQL执行频率二. 定位低效率执行SQL三. explain分析执行计划3.1 id3.2 select_type3.3 table3.4 type3.5 key3.6 rows3.7 extra四. show profile分析SQL前言 在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能…...

xcode 14.3 file not found libarclite_iphoneos.a

最近升级到xcode 14.3 版本的同学,会遇到这个一个问题 File not found: /Users/johnson/Downloads/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a 解决方法(亲测有效) 在podfile文件中,增…...

基于AI+数据驱动的慢查询索引推荐

目前,美团内部每天产生的慢查询数量已经超过上亿条。如何高效准确地为慢查询推荐缺失的索引来改善其执行性能,是美团数据库研发中心面临的一项挑战。为此,我们与华东师范大学开展了科研合作,在AI领域对索引推荐进行了探索和实践&a…...

【ESP32】嵌入式FreeRtos--Task

FreeRTOS中文数据手册:https://www.freertos.org/zh-cn-cmn-s/RTOS.html 任务函数 任务函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreateStatic()使用静态的方法创建一个任务xTaskCreatePinnedToCore指定任务运行的核心(最后一个参数)vTaskDelete()删…...

【操作系统】面试官都爱问的进程调度算法

【操作系统】面试官都爱问的进程调度算法 文章目录【操作系统】面试官都爱问的进程调度算法先来先服务调度算法最短作业优先调度算法高响应比优先调度算法时间片轮转调度算法最高优先级调度算法多级反馈队列调度算法进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU…...

Spring-Web spi机制解析

org.springframework.web.SpringServletContainerInitializer#onStartup 在这里打个断点,查看程序是否会进来 可以发现程序进来了:主要spi机制,看看这里做了什么操作? 去寻找所有实现了WebApplicationInitializer的类 将符合条件…...

数据结构|将链表中小于0的数全部放在大于0的数的前面

题1: 某带头结点的非空单链表L中所有元素为整数,结点类型定义如下: typedef struct node { int data; struct node *next; } LinkNode; 设计一个尽可能高效的算法,将所有小于零的结点移到所有大于等于零的结点的前面。 分…...

分享106个ASP影音娱乐源码,总有一款适合您

分享106个ASP影音娱乐源码,总有一款适合您 106个ASP影音娱乐源码下载链接:https://pan.baidu.com/s/13k8UaJrCci_z4Q0gQbtDtg?pwdjq44 提取码:jq44 Python采集代码下载链接:采集代码.zip - 蓝奏云 我的博客地址:亚…...

win10 PyCharm Anaconda过程记录

1、Anaconda用来配置不同的虚拟环境 进入 Anaconda Prompt 输入conda activate Hui(此为自己创建的放置虚拟环境的文件夹) 编译运行过程中出现No module named seaborn后 pip install seaborn...

Chrome扩展程序导出备份与本地导入浏览器

现在即使在国内下载个chrome,转个插件也千难万难。现在科学上网也越来越难,由于众所周知的原因,连qiang这个话题都是敏感词。哀默于心死,还是回避这个话题 只要把之前装的chrome打包,然后再重新安装一遍。操作步骤如下…...

mysql常用运算符

mysql常用运算符一、去重和空值1.distinct2.null参与运算3.用ifnull函数解决问题二、比较运算符三、dual伪表和数值运算1.常规运算2.比较运算符3.<>安全相等四、常用正则相关的比较运算符1.基本运算符2.模糊查询3.正则表达式五、逻辑运算符六、位运算总结一、去重和空值 …...

PyTorch 深度学习框架:优雅而简洁的代码实现

PyTorch 是由 Facebook 发布的深度学习框架&#xff0c;旨在为研究人员和工程师提供快速、灵活和简单的实验平台。与其他框架相比&#xff0c;PyTorch 具有简洁的 API 和灵活的动态计算图&#xff0c;使得构建和训练深度神经网络变得更加优雅和简洁。本文将介绍 PyTorch 的基本…...

【SpringMVC】请求重定向和转发

forward&#xff1a;表示转发 处理器方法返回ModelAndView,实现转发forward 语法&#xff1a; setViewName("forward:视图文件完整路径") forward特点&#xff1a; 不和视图解析器一同使用&#xff0c;就当项目中没有视图解析器redirect&#xff1a;表示重定向 处理…...

Vue中@click的常见修饰符

在 Vue 的click事件中&#xff0c;可以使用以下修饰符&#xff1a; .stop&#xff1a;阻止事件继续传播。.prevent&#xff1a;阻止默认事件。.capture&#xff1a;使用事件捕获模式。.self&#xff1a;只当事件是从侦听器绑定的元素本身触发时才触发回调。.once&#xff1a;只…...

软件测试面试复盘:技术面没有难倒我,hr面被虐的体无完肤

一般提到面试&#xff0c;肯定都会想问一下面试结果&#xff0c;我就大概的说一下面试结果&#xff0c;哈哈&#xff0c;其实不太想说&#xff0c;因为挺惨的&#xff0c;并没有像很多大佬一样 ”已拿字节阿里腾讯各大厂offer”&#xff0c;但是毕竟是自己的经历&#xff0c;无…...

vue实现鼠标移入移出事件+解决鼠标事件没有反应

鼠标移入移出事件代码 <div mouseenter"onMouseOver(item)" mouseleave"onMouseOut"></div> methods methods:{// 鼠标移入onMouseOver(item){console.log(item, 鼠标进来了);},// 鼠标移出onMouseOut(){console.log(鼠标出去了);}, }, 这…...

右键移动文件.cmd

REM xcopy /yis %1% % % %D:\test\% REM https://zhuanlan.zhihu.com/p/38330443 不能移动文件夹 不知道为什么 xcopy&#xff08;拷贝目录文件、目录结构的指令&#xff09;_尚可名片 写了个JAVA程序&#xff0c;怎样实现在win选中文件后&#xff0c;右键发送到我的程序&am…...

web基础

web基础 与http 域名&#xff1a;由于IP地址不易记忆&#xff0c;域名用来代替IP地址&#xff0c; &#xff08;DNS&#xff09;服务与配置&#xff1a;先在本地hosts里去找&#xff0c;然后在本地域名服务器递归查找&#xff0c;本地域名服务器在一级二级按域名长度迭代查找后…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...