当前位置: 首页 > 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 感谢一路相伴…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...