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

设计模式之七大原则

👑单一职责原则

        单一职责原则告诉我们一个类应该只有一个责任或者只负责一件事情。

        想象一下,如果一个类承担了太多的责任,就像一个人同时负责做饭、洗衣服和打扫卫生一样,那么这个类会变得非常复杂,难以理解和维护。而且,当需要修改其中一个功能时,可能会影响到其他功能,导致意想不到的问题。

        通过遵循单一职责原则,我们可以将一个复杂的类拆分成多个小的、具有独立职责的类。每个类只关注自己的职责,这样代码会更加清晰、易于理解和修改。

        举个例子,假设我们有一个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循环&#xff0c;通过索引遍历 for (int i 0; i < list.size(); i) {Syst…...

【SQL应知应会】索引(二)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 索引 • MySQL版 前言一、索引1.简介2.创建2.1 索引…...

Android 简单的视频、图片压缩工具

首页需要压缩的工具包 1.Gradle implementation com.iceteck.silicompressorr:silicompressor:2.2.3 2.添加相关权限&#xff08;手机得动态申请权限&#xff09; <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 网卡信息&#xff1a;ifconfig eth0 dns1&#xff1a;getprop net.dns1 dns2&#xff1a;getprop net.dns2 12、屏幕分辨率&#xff1a;wm size 11、…...

低代码开发工具:JVS轻应用之间如何实现数据的调用?

在低代码开发平台中&#xff0c;如何实现应用之间的数据共享呢&#xff1f;最标准的方式是通过接口&#xff0c;本文介绍JVS轻应用如何实现将数据通过API输出、轻应用如何实现体内API数据的获取&#xff1f;实现方式如下图所示&#xff0c;不管是数据提供方&#xff0c;还是数据…...

在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 指令&#xff08;了解&#xff09;&#xff1a;结合CSS2.3.3 元素2.3.4 属性**XML 元素 vs. 属…...

Linu学习笔记——常用命令

Linux 常用命令全拼&#xff1a; Linux 常用命令全拼 | 菜鸟教程 一、切换root用户 1.给root用户设置密码 sudo passwd root 2.输入密码&#xff0c;并确认密码 3.切换到root用户 su&#xff1a;Swith user(切换用户) su root 二、切换目录 目录结构&#xff1a;Linux 系…...

PLUS操作流程、应用与实践,多源不同分辨率数据的处理、ArcGIS的应用、PLUS模型的应用、InVEST模型的应用

PLUS模型是由中国地质大学&#xff08;武汉&#xff09;地理与信息工程学院高性能空间计算智能实验室开发&#xff0c;是一个基于栅格数据的可用于斑块尺度土地利用/土地覆盖(LULC)变化模拟的元胞自动机(CA)模型。PLUS模型集成了基于土地扩张分析的规则挖掘方法和基于多类型随机…...

item_review-获得淘宝商品评论

一、接口参数说明&#xff1a; item_review-获得淘宝商品评论&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_review 名称类型必须描述keyString是调用key&#xff08;点击获…...

如何读取文件夹内的诸多文件,并选择性的保留部分文件

目录 问题描述: 问题解决: 问题描述: 当前有一个二级文件夹,第一层是文件夹名称是“Papers(LNAI14302-14304)",第二级文件夹目录名称如下图蓝色部分所示。第三层为存放的文件,如下下图所示,每一个文件中,均存放三个文件,分别为copyright.pdf, submission.pdf, s…...

每天一道leetcode:1129. 颜色交替的最短路径(图论中等广度优先遍历)

今日份题目&#xff1a; 给定一个整数 n&#xff0c;即有向图中的节点数&#xff0c;其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色&#xff0c;并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges&#xff0c;其中&#xff1a; redEdges[i] [ai, bi…...

原生js发送ajax请求---ajax请求篇(一)

在原生js中我们使用的是XMLHttpRequest对象来发送ajax请求 主要步骤就是&#xff1a; 1.创建XMLHTTPRequest对象 2.使用open方法设置和服务器的交互信息 3.设置发送的数据&#xff0c;开始和服务器端交互 4.注册事件 5.更新界面 &#xff08;1&#xff09; 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教程专栏&#xff0c;如果你还没看过第0篇&#xff0c;点击C教程 - How to C系列专栏第0篇去第0篇 本专栏一致使用操作系统&#xff1a;macOS Ventura&#xff0c;代码编辑器&#xff1a;CLion&#xff0c;C编译器&#xff1a;Clang 感谢一路相伴…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...