设计模式之七大原则
👑单一职责原则
单一职责原则告诉我们一个类应该只有一个责任或者只负责一件事情。
想象一下,如果一个类承担了太多的责任,就像一个人同时负责做饭、洗衣服和打扫卫生一样,那么这个类会变得非常复杂,难以理解和维护。而且,当需要修改其中一个功能时,可能会影响到其他功能,导致意想不到的问题。
通过遵循单一职责原则,我们可以将一个复杂的类拆分成多个小的、具有独立职责的类。每个类只关注自己的职责,这样代码会更加清晰、易于理解和修改。
举个例子,假设我们有一个User类,它既负责用户的登录验证,又负责用户信息的管理。按照单一职责原则,我们可以将这个类拆分成两个类:一个负责用户的登录验证,另一个负责用户信息的管理。这样,当我们需要修改登录验证逻辑时,就不会影响到用户信息的管理部分。
总结起来,单一职责原则的核心思想是:一个类应该只有一个责任,这样可以提高代码的可读性、可维护性和可扩展性。
👑里氏替换原则
里氏替换原则指导我们如何设计和使用继承关系。简单来说,里氏替换原则告诉我们,子类对象可以替换父类对象出现在任何能使用父类对象的地方,而不会产生错误或者破坏程序的正确性。
举个例子,假设有一个动物类Animal,其中有一个方法叫做makeSound(),用于发出动物的声音。然后我们派生出了两个子类Cat和Dog,它们都继承自Animal类。按照里氏替换原则,我们可以在任何需要Animal对象的地方使用Cat或Dog对象,比如调用makeSound()方法。
具体到代码实现上,如果Cat和Dog类分别实现了自己的makeSound()方法,那么无论是Animal类型的变量还是Cat、Dog类型的变量,都可以调用makeSound()方法,而且得到的结果应该符合预期。
总结起来,里氏替换原则的核心思想是:子类对象应该能够替换父类对象,而不会引起任何错误或异常。这样设计出来的代码更加灵活、可扩展,并且易于维护。
👑开闭原则
开闭原则告诉我们软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
开闭原则的核心思想是:当需要改变一个系统的行为时,我们应该尽量通过添加新的代码来实现,而不是修改已有的代码。这样做的好处是,我们可以保持已有的代码稳定性,减少引入新错误的风险。
举个例子,假设我们有一个电商网站,其中有一个购物车类Cart,用于管理用户的购物车信息。现在,我们需要添加一个新的功能,比如优惠券折扣。按照开闭原则,我们应该创建一个新的类DiscountCoupon,并且让它负责计算折扣金额。然后,在Cart类中,我们可以通过调用DiscountCoupon类的方法来获取折扣金额,而不是直接修改Cart类的代码。
这样做的好处是,如果以后我们需要添加其他类型的折扣,比如满减或者赠品,我们只需要创建相应的类,并且确保它们都符合同一个抽象接口。这样,我们可以轻松地扩展系统的功能,而不需要修改已有的代码。
总结起来,开闭原则的目标是让我们能够通过扩展来改变一个系统的行为,而不需要修改已有的代码。这样可以提高代码的稳定性、可维护性和可扩展性。
👑依赖倒转原则
依赖倒转原则告诉我们高层模块不应该依赖于低层模块,而是应该依赖于抽象。
通俗地说,依赖倒转原则就是要求我们在设计代码时,尽量使用抽象类或者接口来进行编程,而不是直接依赖具体的实现类。这样做的好处是,可以降低模块之间的耦合度,提高代码的灵活性和可维护性。
举个例子,假设我们有一个电商网站,其中有一个Order类用于处理订单相关的逻辑。按照依赖倒转原则,我们应该定义一个抽象的Payment接口,然后让Order类依赖于这个接口。具体的支付方式,比如支付宝、微信支付等,都应该实现这个接口,并且提供自己的具体实现。
这样做的好处是,当我们需要更换支付方式时,比如从支付宝切换到微信支付,我们只需要创建一个新的实现类,并且修改配置文件或者注入相应的实例即可,而不需要修改Order类的代码。这样,我们可以轻松地扩展和变更系统的功能,而不会对其他模块产生影响。
总结起来,依赖倒转原则的核心思想是:高层模块不应该依赖于低层模块,而是应该依赖于抽象。通过使用抽象类或者接口来编程,可以降低模块之间的耦合度,提高代码的灵活性和可维护性。
👑接口隔离原则
接口隔离原则告诉我们客户端不应该依赖于它不需要的接口。
通俗地说,接口隔离原则就是要求我们将庞大而臃肿的接口拆分成更小、更具体的接口,以满足客户端的精确需求。这样做的好处是,可以降低客户端与接口之间的耦合度,提高代码的灵活性和可维护性。
举个例子,假设我们有一个电商网站,其中有一个Product类用于处理商品相关的逻辑。按照接口隔离原则,我们应该将Product类的接口拆分成多个更小的接口,比如IProductInfo和IProductReview。这样,客户端只需要依赖于它们所需的接口,而不需要依赖整个Product类的接口。
这样做的好处是,当我们需要在客户端中使用商品信息时,只需要实现IProductInfo接口即可,而不需要关心其他不需要的方法。同样,当我们需要在客户端中使用商品评价时,只需要实现IProductReview接口即可。
通过接口隔离原则,我们可以避免客户端依赖于不需要的接口,减少了对无用方法的依赖,提高了代码的可读性和可维护性。同时,接口隔离原则也促进了代码的复用,因为我们可以根据需要选择实现不同的接口。
总结起来,接口隔离原则的核心思想是:客户端不应该依赖于它不需要的接口。通过拆分庞大的接口,只提供客户端所需的精确接口,可以降低耦合度,提高代码的灵活性和可维护性。
👑迪米特法则
迪米特法则,也被称为最少知识原则,它告诉我们一个对象应该尽量减少与其他对象之间的交互,只与直接的朋友进行通信。
通俗地说,迪米特法则就是要求我们在设计代码时,尽量降低对象之间的耦合度,避免一个对象过多地了解其他对象的内部细节。这样做的好处是,可以提高代码的可维护性和灵活性,减少对其他对象的依赖。
举个例子,假设我们有一个电商网站,其中有一个Order类用于处理订单相关的逻辑。按照迪米特法则,我们应该尽量减少Order类与其他类的直接交互,只与必要的对象进行通信,比如与Product类、Payment类等直接相关的对象。
这样做的好处是,当需要修改或者扩展系统的某个功能时,我们只需要关注与之直接相关的对象,而不需要考虑其他无关的对象。这样可以降低代码的复杂度,提高代码的可读性和可维护性。
另外,迪米特法则还鼓励使用中间对象来协调其他对象之间的交互,以减少对象之间的直接依赖关系。这样可以提高系统的灵活性,降低耦合度。
总结起来,迪米特法则的核心思想是:一个对象应该尽量减少与其他对象之间的交互,只与直接的朋友进行通信。通过降低对象之间的耦合度,可以提高代码的可维护性和灵活性,减少对其他对象的依赖。
👑合成复用原则
合成复用原则告诉我们在设计代码时,应该优先使用组合(composition)而不是继承(inheritance)来实现复用。
通俗地说,合成复用原则就是要求我们通过将已有的类组合起来,构建新的类来实现复用,而不是通过继承已有的类。这样做的好处是,可以减少类之间的耦合度,提高代码的灵活性和可维护性。
举个例子,假设我们有一个电商网站,其中有一个Order类用于处理订单相关的逻辑。按照合成复用原则,我们应该优先使用组合来实现订单的功能,而不是通过继承已有的类。
具体来说,我们可以定义一个Order类,然后在该类中使用其他已有的类,比如Product类和Payment类,作为其成员变量。这样,Order类就可以通过调用这些成员变量的方法来实现自己的功能,而不需要继承这些类。
这样做的好处是,当我们需要修改或者扩展系统的某个功能时,只需要关注与之相关的类,而不需要影响到其他类。同时,由于使用了组合而不是继承,我们可以更加灵活地选择和替换成员变量,以满足不同的需求。
总结起来,合成复用原则的核心思想是:优先使用组合而不是继承来实现复用。通过将已有的类组合起来构建新的类,可以降低耦合度,提高代码的灵活性和可维护性。
相关文章:
设计模式之七大原则
👑单一职责原则 单一职责原则告诉我们一个类应该只有一个责任或者只负责一件事情。 想象一下,如果一个类承担了太多的责任,就像一个人同时负责做饭、洗衣服和打扫卫生一样,那么这个类会变得非常复杂,难以理解和维护。而…...
pytorch入门-TensorBoard和Transforms
TensorBoard from PIL import Image from torch.utils.tensorboard import SummaryWriter from torchvision import transforms# python的用法 -》 tensor数据类型 # 通过transforms.ToTensor 去解决两个问题 # 1. transforms该如何使用(python) # 2. …...
【java】Java基础——接口和实现
当一个类实现一个接口时,必须提供接口中定义的所有方法的具体实现,除非这个类是抽象类。默认方法:default修饰接口中的方法,可实现方法体,在实现接口的类中可以不重写该方法 // 定义一个接口,接口不关心方…...
JetPack Compose 学习笔记(持续整理中...)
1.为什么要学? 1.命令式和声明式 UI大战,个人认为命令式UI自定义程度较高,能更深入到性能,内存优化方面,而申明式UI 是现在主流的设计,比如React,React Native,Flutter,Swift UI等等,现在性能也逐渐在变得更好 2.还有一个原因compose 是KMM 是完整跨平台的UI基础 3.…...
遍历集合List的五种方法以及如何在遍历集合过程中安全移除元素
一、遍历集合List的五种方法 测试数据 List<String> list new ArrayList<>(); list.add("A");list.add("B");list.add("C");1. 普通for循环 普通for循环,通过索引遍历 for (int i 0; i < list.size(); i) {Syst…...
【SQL应知应会】索引(二)• MySQL版
欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 索引 • MySQL版 前言一、索引1.简介2.创建2.1 索引…...
Android 简单的视频、图片压缩工具
首页需要压缩的工具包 1.Gradle implementation com.iceteck.silicompressorr:silicompressor:2.2.3 2.添加相关权限(手机得动态申请权限) <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-p…...
信息论、推理和机器学习算法之间交叉的经典例子
信息论、推理和机器学习算法之间交叉的经典例子: 熵和信息增益在决策树学习中的应用。信息增益利用熵的概念来评估特征的分类能力,从而指导决策树的增长。 交叉熵在神经网络训练中的广泛使用。它结合信息论与最大似然推断,用于度量预测分布与真实分布之间的距离。 变分推断常被…...
【多线程】网络原理初识
网络原理初识 1. 网络发展史1.2 独立模式1.3 网络互联1.3 局域网1.4 广域网 2. 网络通信基础2.1 IP地址2.2 端口号2.3 认识协议2.4 五元组2.5 协议分层2.5.1 什么是协议分层2.5.2 协议分层的好处2.5.2 OSI七层模型2.5.3 TCP/IP五层模型 2.6 封装和分用2.6.1 封装2.6.1.1 应用层…...
Android之ADB常用命令
15、查看ipv6 是否使能 sysctl -a | grep ipv6 | grep disable 13、以太网获取Ip、网关、子网掩码、域名等 adb shell 网卡信息:ifconfig eth0 dns1:getprop net.dns1 dns2:getprop net.dns2 12、屏幕分辨率:wm size 11、…...
低代码开发工具:JVS轻应用之间如何实现数据的调用?
在低代码开发平台中,如何实现应用之间的数据共享呢?最标准的方式是通过接口,本文介绍JVS轻应用如何实现将数据通过API输出、轻应用如何实现体内API数据的获取?实现方式如下图所示,不管是数据提供方,还是数据…...
在Java中对XML的简单应用
XML 数据传输格式1 XML 概述1.1 什么是 XML1.2 XML 与 HTML 的主要差异1.3 XML 不是对 HTML 的替代 2 XML 语法2.1 基本语法2.2 快速入门2.3 组成部分2.3.1 文档声明格式属性 2.3.2 指令(了解):结合CSS2.3.3 元素2.3.4 属性**XML 元素 vs. 属…...
Linu学习笔记——常用命令
Linux 常用命令全拼: Linux 常用命令全拼 | 菜鸟教程 一、切换root用户 1.给root用户设置密码 sudo passwd root 2.输入密码,并确认密码 3.切换到root用户 su:Swith user(切换用户) su root 二、切换目录 目录结构:Linux 系…...
PLUS操作流程、应用与实践,多源不同分辨率数据的处理、ArcGIS的应用、PLUS模型的应用、InVEST模型的应用
PLUS模型是由中国地质大学(武汉)地理与信息工程学院高性能空间计算智能实验室开发,是一个基于栅格数据的可用于斑块尺度土地利用/土地覆盖(LULC)变化模拟的元胞自动机(CA)模型。PLUS模型集成了基于土地扩张分析的规则挖掘方法和基于多类型随机…...
item_review-获得淘宝商品评论
一、接口参数说明: item_review-获得淘宝商品评论,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_review 名称类型必须描述keyString是调用key(点击获…...
如何读取文件夹内的诸多文件,并选择性的保留部分文件
目录 问题描述: 问题解决: 问题描述: 当前有一个二级文件夹,第一层是文件夹名称是“Papers(LNAI14302-14304)",第二级文件夹目录名称如下图蓝色部分所示。第三层为存放的文件,如下下图所示,每一个文件中,均存放三个文件,分别为copyright.pdf, submission.pdf, s…...
每天一道leetcode:1129. 颜色交替的最短路径(图论中等广度优先遍历)
今日份题目: 给定一个整数 n,即有向图中的节点数,其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges,其中: redEdges[i] [ai, bi…...
原生js发送ajax请求---ajax请求篇(一)
在原生js中我们使用的是XMLHttpRequest对象来发送ajax请求 主要步骤就是: 1.创建XMLHTTPRequest对象 2.使用open方法设置和服务器的交互信息 3.设置发送的数据,开始和服务器端交互 4.注册事件 5.更新界面 (1) get方式 //步骤一…...
【ARM 嵌入式 编译系列 2.1 -- GCC 编译参数学习】
文章目录 1.1 GCC 编译参数1.1.1 GCC arm-noe-eabi- 介绍1.1.1.1 ARM 和 Thumb 指令集区别1.1.2 GCC CFLAGS 介绍1.1.3 GCC LDFLAGS 介绍1.1.4 CXXFLAGS 介绍上篇文章:ARM 嵌入式 编译系列 2 – GCC 编译过程介绍 下篇文章:ARM 嵌入式 C 入门及渐进 3 – GCC attribute((weak…...
C++教程 - How to C++系列专栏第3篇
关于专栏 这个专栏是优质的C教程专栏,如果你还没看过第0篇,点击C教程 - How to C系列专栏第0篇去第0篇 本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C编译器:Clang 感谢一路相伴…...
SpringBoot项目结构深度解析:为什么你的Controller总报404?这些目录规范必须掌握
SpringBoot项目结构深度解析:为什么你的Controller总报404?这些目录规范必须掌握 在企业级SpringBoot开发中,目录结构看似简单却暗藏玄机。我曾见过团队因为一个包名大小写问题排查三天,也遇到过新人将Controller放在resources目录…...
Layerdivider终极指南:3步完成专业PSD分层,大幅提升设计效率
Layerdivider终极指南:3步完成专业PSD分层,大幅提升设计效率 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经花费数小时…...
终极指南:如何快速提升QuaggaJS在低分辨率图像下的条形码识别能力
终极指南:如何快速提升QuaggaJS在低分辨率图像下的条形码识别能力 【免费下载链接】quaggaJS An advanced barcode-scanner written in JavaScript 项目地址: https://gitcode.com/gh_mirrors/qu/quaggaJS QuaggaJS是一款强大的JavaScript条形码扫描库&#…...
7类水面自动驾驶目标检测数据集该数据集已经包括7个类别类别名字分别是:[‘pier‘, ‘ship‘, ‘boat‘, ‘sailor‘, ‘buoy‘, ‘vessel‘, ‘kayak‘]
7类水面自动驾驶目标检测数据集 该数据集已经包括7个类别 类别名字分别是: [pier, ship, boat, sailor, buoy, vessel, kayak] 共计图片54120张,图像分辨率是1920x1080 数据集是txt格式 数据集按照7:1:2已划分为训练集/验证集和测试集 相关YOLOv5/YOLOv6…...
别再死记硬背LFSR了!用Verilog手搓一个伽罗瓦型伪随机数发生器(附完整代码与仿真)
从零构建伽罗瓦LFSR:Verilog实战指南与工程避坑手册 在数字通信系统的测试环节中,工程师常常需要生成特定的数据序列来模拟真实场景。我曾在一个无线模块开发项目中,为了测试接收机的抗干扰能力,需要快速生成符合特定统计特性的伪…...
Maven证书验证难题:彻底绕过PKIX path building failed的实战指南
1. 遇到PKIX path building failed?别慌,这是证书验证的锅 最近在项目编译时突然蹦出个"PKIX path building failed"的错误,是不是让你一头雾水?这其实是Maven在下载依赖时遇到了证书验证问题。简单来说,就…...
为什么选择Webpack:Awesome-Webpack项目终极指南与核心价值解析
为什么选择Webpack:Awesome-Webpack项目终极指南与核心价值解析 【免费下载链接】awesome-webpack A curated list of awesome Webpack resources, libraries and tools 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-webpack Webpack作为现代前端开…...
Zabbix7监控Oracle 19c实战:手把手教你配置zabbix-agent2环境变量与TSN
Zabbix7监控Oracle 19c全栈配置指南:从环境变量到TSN深度解析 在当今企业级监控领域,Zabbix7与Oracle 19c的组合已成为数据库监控的黄金标准。本文将带您深入探索如何通过zabbix-agent2实现Oracle数据库的全方位监控,特别聚焦于CentOS7.9环境…...
从选型到贴片:启英泰伦CI13XX芯片硬件设计避坑指南(附PCB布局建议)
启英泰伦CI13XX芯片硬件设计实战:从选型到量产的工程化解决方案 在智能语音硬件开发领域,启英泰伦CI13XX系列芯片凭借其高度集成的BNPU V3神经网络处理器和丰富的接口资源,已成为离线语音识别方案的热门选择。然而,从芯片选型到最…...
5个实用技巧让华硕笔记本性能提升30%:GHelper全功能解析
5个实用技巧让华硕笔记本性能提升30%:GHelper全功能解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, …...
