【设计模式】一文理解记住设计模式的原则

目录——阅读所需预计5-10分钟

  • 🎖️前言
    • 🎯单一职责原则
      • 📣1. 定义
      • 💞2. 定义很抽象,咱继续看
      • 🎉3. 举几个栗子
      • 💞4. 以上栗子出现了一个问题,单一职责的划分究竟可以分多细
      • 👉5. 怎么记住这个原则
    • 😜接口隔离原则
      • 😍1. 是不是觉得这个"隔离"和上面单一职责的"划分"很像,隔离意味着划分,不是一样的东西吗?怎么区别两者的区别呢
      • 🚀2.接口隔离原则主要体现在两个方面
        • 🐴2.1. 不要使用没有任何依赖关系的接口
        • 🧐为什么?
        • 🙆2.2 一个类对另一个类的依赖性应该建立在最小的接口上
    • 🐢3. 怎么记住这个原则
    • 🍑里氏替换原则
      • 💌1. 定义
      • 🌈2. 怎么记住他
      • 🎽3. 子类覆盖父类已实现的方法 ,我觉得没啥意义的原因
    • 📡依赖倒置原则
      • 😎1. 定义
      • 🙆2. 怎么理解他
      • 🤡3. 怎么记住他
    • 😜迪米特原则
      • 💎1. 定义
      • 🔍2. 怎么理解他
      • 🎖️3. 怎么记住他
    • 🎆开闭原则
      • 📣1. 定义
      • ❤️2. 怎么理解
      • 🎯3. 怎么记住他
  • 设计模式的分类
    • 创建型模式
    • 结构型模式
    • 行为模式

🎖️前言

本文只针对用几分钟快速了解设计模式的原则,更详细请查找更多资料

🎯单一职责原则

📣1. 定义

她规定一个类应该只有一个发生变化的原因

💞2. 定义很抽象,咱继续看

单一职责原则强调职责的分离,就是一个类只能负责一种职责行为

🎉3. 举几个栗子

  • SpringBoot的Main类,只有一个职责——启动项目
  • SpringMVC的Controller层,Service层,DAO层划分不同的职责
  • UserController对应一个职责——对用户相关职责
  • UserController的登录功能也可以分离成一个类——对应单一的登录职责

💞4. 以上栗子出现了一个问题,单一职责的划分究竟可以分多细

  • 规矩是人定的,符号业务需求就好
  • 一个用户控制类可以划分出登录类负责单一登录职责,需要看需求而定,如果登录方式有QQ,微信等多种方式,单独划分出登录控制类是合理的,但是如果只有一个账号密码登录方法,将其划分出来是否显得多余。

👉5. 怎么记住这个原则

  • 最典型的代表——记住SpringBoot的主函数是单一职责原则,看到他就想起:单一职责原则

😜接口隔离原则

😍1. 是不是觉得这个"隔离"和上面单一职责的"划分"很像,隔离意味着划分,不是一样的东西吗?怎么区别两者的区别呢

  • 单一职责原则是接口隔离原则的基础
  • 单一职责原则注重从职责的角度进行类或接口的划分
  • 在此基础上,接口隔离原则登场,注重接口使用的“精确性”和"最小化"
  • 如果还是很迷惑,没事继续往下看

🚀2.接口隔离原则主要体现在两个方面

🐴2.1. 不要使用没有任何依赖关系的接口
  • 简单来说就是不要使用那些完全没有必要实现的接口
  • 举个JDK源码的栗子——JDK的作者也犯过这个错
public static void main(String[] args){
    List<Object> list = Collections.emptyList();
    list.add(new Object());
}

我们执行这个代码会报错
图片.png

🧐为什么?

因为通过emptyList()创建的空集合是不支持add()方法的,但这不是重点,重点在于EmptyList对象实现了一个RandomAccess接口。
图片.png
因为 EmptyList对象实现了一个RandomAccess接口 ,意味着 emptyList()空对象要支持随机访问,但是从这个 emptyList()创建到销毁都不能add()进去一个对象,有谈何随机访问呢? 那这个 RandomAccess接口 就是无意义的。
所以 RandomAccess接口 违反了接口隔离原则,所以JDK作者也会犯错哈哈(虽然无伤大雅)

  • 所有再次强调接口隔离第一条原则: 不要使用没有任何依赖关系的接口
🙆2.2 一个类对另一个类的依赖性应该建立在最小的接口上
  • 简单理解就是把接口的按单一职责划分清楚,再给子类去实现使用
  • 再用JDK的代码举个例子

图片.png上面就将接口划分为

  • 支持随机访问
  • 支持序列化

所有总的来说,这就是接口隔离,在单一职责原则的基础上,不使用没有依赖关系的接口,对接口进行更精确,细化的划分,从而达到接口隔离的境界。

🐢3. 怎么记住这个原则

  • 接口隔离就是把不要的接口去掉,把(细糠)接口按单一职责分好留下来
  • 再次强调: 不要使用没有任何依赖关系的接口
  • 再次强调: 一个类对另一个类的依赖性应该建立在最小的接口上

🍑里氏替换原则

💌1. 定义

  • 子类需要实现父类所有抽象方法——(其实你一定会这么做的,不然编译器就爆红了)
  • 子类可以增扩自己的方法和属性
  • 子类重载覆盖父类已实现的方法(我觉得这个没啥实际意义,可以忽略这条,在下方阐述原因)

🌈2. 怎么记住他

  • 里氏的氏,联想到父子
  • 子承父业,子再发家
  • 子类继承父类已有的方法,子类增加自己的属性和方法

🎽3. 子类覆盖父类已实现的方法 ,我觉得没啥意义的原因

  • 从业务的角度,子类覆盖父类已实现的方法,可以通过静态委派调用被重载的父类的方法,但是搞那么复杂干嘛,我想用子类调用方法直接在子类新增想要的方法就行了,想用父类的就直接用,何必搞个静态委派折磨人。

📡依赖倒置原则

😎1. 定义

就是面向接口编程

🙆2. 怎么理解他

  • 去搜一下面向接口编程,此处不赘述,简单理解就是对多态的运用。

🤡3. 怎么记住他

  • 依赖倒置就是从依赖具体的对象倒置成依赖抽象的接口

😜迪米特原则

💎1. 定义

  • 最少知道原则

🔍2. 怎么理解他

  • 一个类对另一个类知道的越少越好,一个类只通过一个接口通信,但不会暴露内部细节给对方
  • 类比客户端和服务器,只需要暴露一个接口,内部怎么实现不关心

🎖️3. 怎么记住他

  • 迪 和 低谐音,低就是少
  • 即最少依赖原则

🎆开闭原则

📣1. 定义

对修改关闭,对扩展开放

❤️2. 怎么理解

不用修改已有的类,只通过新增代码,达到添加功能的目的

🎯3. 怎么记住他

  • 对修改关闭,对扩展开放

设计模式的分类

此处不展开

创建型模式

  • 工厂方法模式
  • 抽象工厂模式
  • 单例模式
  • 建造者模式
  • 原型模式

结构型模式

  • 适配器模式
  • 桥接模式
  • 装饰模式
  • 组合模式
  • 外观模式
  • 享元模式
  • 代理模式

行为模式

  • 策略模式
  • 模版方法模式
  • 观察者模式
  • 迭代器模式
  • 责任链模式
  • 命令模式
  • 备忘录模式
  • 状态模式
  • 访问者模式
  • 中介者模式
  • 解释器模式

~理解有限,有错再补
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/303651.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握Lazada API接口:开启电商开发新篇章,引领业务增长潮流

一、概述 Lazada API接口是Lazada平台提供的软件开发工具包&#xff0c;它允许第三方开发者通过编程方式访问Lazada平台上的商品、订单、用户等数据&#xff0c;并执行相关操作。通过使用Lazada API接口&#xff0c;开发者可以快速构建与Lazada平台集成的应用程序&#xff0c;…

Ubuntu 18.04.5 LTS 解决安装包复杂依赖相关问题解决的主要法则和VIM的安装实录

前言&#xff1a;目标和环境 环境&#xff1a; Ubuntu 18.04.5 LTSVMware 目标&#xff1a; 安装vim&#xff0c;解决包依赖的冲突&#xff1a; 本文&#xff0c;通过一个很好的实例&#xff0c;诠释了&#xff0c;LINUX系统下&#xff0c;安装一个应用遇到的依赖库问题如何…

单片机原理及应用:中断系统结构与控制寄存器

大家好啊&#xff0c;这几天因为考试断更了一段时间&#xff0c;现在放假了也可以恢复正常的更新速度了。今天我们来认识一下单片机的中断系统&#xff0c;这里可以说是我们学习单片机以来第一个核心功能&#xff0c;我们会分几期内容来深入了解中断系统的作用原理和应用方式。…

【K8S 云原生】Kurbernets集群的调度策略

目录 一、Kubernetes的list-watch机制 1、List-watch 2、创建pod的过程&#xff1a; 二、scheduler调度的过程和策略&#xff1a; 1、简介 2、预算策略&#xff1a;predicate 3、优先策略&#xff1a; 3.1、leastrequestedpriority&#xff1a; 3.2、balanceresourceal…

linux 系统安全及应用

一、账号安全基本措施 1.系统账号清理 1.将用户设置为无法登录 /sbin/nologin shell——/sbin/nologin却比较特殊&#xff0c;所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已&#xff0c;并不是说这个账号就无法使用系统资源。举例来说&#xff0c;…

MySQL语法练习-DML语法练习

文章目录 0、相关文章1、添加数据2、修改数据3、删除数据4、总结 0、相关文章 《MySQL练习-DDL语法练习》 1、添加数据 # 给指定字段添加数据 insert into 表名 (字段名1,字段名2,...) values(值1,值2...);# 给全部字段添加数据 insert into 表名 values(值1,值2,...);#批量…

Mac robotframework+pycharm运行suite报错情况:ImportError: No module named request

报错实例&#xff1a; 当前Preferences–>Tool–>External Tools Suite配置&#xff0c;显示使用的python为2.7版本&#xff0c;robotframework安装在当前版本的python中&#xff1a; 但是我pycharm现在的环境配置的python为3.11&#xff0c;当前使用的RF与当前使用的py…

5.2 Android BCC环境搭建(adeb版,下)更新中

五&#xff0c;运行adeb shell adeb shell 六&#xff0c;其他指令 6.1 从开发机移除adeb adeb remove 6.2 更新开发机adeb deb git-pull 6.3 使用ssh替代adeb进行与android设备的通信 adeb --ssh <uri> --sshpass <pass> <cmd> 七&#xff0c;BCC配置…

1-05使用VS调式程序

一、概述 写代码总不是一帆风顺的&#xff0c;总会碰到一些问题&#xff0c;检查问题&#xff0c;排除错误&#xff08;也就是Debug程序&#xff09;&#xff0c;对于任何程序员而言都是基本功。 我们前面讲过&#xff0c;C语言是一门很容易出错&#xff0c;且自身不提供异常…

excel统计分析——LSD多重比较

参考资料&#xff1a;生物统计学 一篇教你搞定显著性差异分析abcd字母标记法 LSD&#xff08;least significant difference&#xff0c;最小显著差数法&#xff09;是R. A. Fisher提出的&#xff0c;又称为Fisher LSD检验法&#xff0c;是最早用于检验各组均数间两两差异的方…

软件工程概论---内聚性和耦合性

目录 一.耦合性 1.内容耦合 2.公共耦合 4.控制耦合 5.标记耦合&#xff08;特征耦合&#xff09; 6.数据耦合 7.非直接耦合 二.内聚性 1.偶然内聚 2.逻辑内聚 3.时间内聚 4.过程内聚 5.通信内聚 6.顺序内聚 7.功能内聚 一.耦合性 耦合性是指软件结构中模块相互…

java常用应用程序编程接口(API)——String概述及使用案例

前言&#xff1a; 开始学到api的String&#xff0c;整理下心得。打好基础&#xff0c;daydayup! API&#xff1a; API是什么&#xff1f; API&#xff08;Application Programming Interface&#xff09;又名应用程序编程接口。是别人编好的程序的合集。 为什么要使用API&…

YOLOv5改进 | 2023Neck篇 | 利用Gold-YOLO针对小目标进行检测(附完整修改教程 + 代码)

一、本文介绍 本文给大家带来的改进机制是Gold-YOLO利用其Neck改进v8的Neck,GoLd-YOLO引入了一种新的机制——信息聚集-分发(Gather-and-Distribute, GD)。这个机制通过全局融合不同层次的特征并将融合后的全局信息注入到各个层级中,从而实现更高效的信息交互和融合。这种…

关于订单超时后用户却已支付的解决方案

场景: 一般我们下的一些订单&#xff0c;比如电商平台、外卖平台的都是有超时时间的&#xff0c;默认一般15或者30分钟&#xff0c;那么超时未支付订单会被自动取消&#xff0c;那么如果刚好有人在关闭订单的时候去支付成功了&#xff0c;或者说支付平台延迟了一下&#xff0c;…

开启Android学习之旅-5-Activity全屏

Android 两种方式设置全屏&#xff1a; 1. 第一行代码中的方法 通过 getWindow().getDecorView()方法拿到当前Activity的DecorView,再调用 setSystemUiVisibility() 方法来改变系统UI的显示&#xff0c;这里传入了 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 和 View.SYSTEM_UI_…

【EAI 005】EmbodiedGPT:通过具身思维链进行视觉语言预训练的具身智能大模型

论文描述&#xff1a;EmbodiedGPT: Vision-Language Pre-Training via Embodied Chain of Thought 论文作者&#xff1a;Yao Mu, Qinglong Zhang, Mengkang Hu, Wenhai Wang, Mingyu Ding, Jun Jin, Bin Wang, Jifeng Dai, Yu Qiao, Ping Luo 作者单位&#xff1a;The Universi…

vue3 封裝一个常用固定按钮组件(添加、上传、下载、删除)

效果图 这个组件只有四个按钮&#xff0c;添加&#xff0c;上传、下载、删除&#xff0c;其中删除按钮的颜色默认是灰色&#xff0c;当表格有数据选中时再变成红色 实现 组件代码 <script lang"ts" setup> import { Icon } from /components/Icon/index im…

PCL 格网法计算点云的占地面积

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 该方法主要用于粗略统计机载点云的占地面积。方法原理是将点云沿 X O Y XOY

Rust 常用集合(上)

目录 1、使用 Vector 储存列表 1.1 新建 vector 1.2 更新 vector 1.3 读取 vector 的元素 1.4 遍历 vector 中的元素 1.5 使用枚举来储存多种类型 1.6 丢弃 vector 时也会丢弃其所有元素 2、使用字符串储存 UTF-8 编码的文本 2.1 什么是字符串&#xff1f; 2.2 新建字…

tiktok云手机有用吗?用哪个好?

很多做独立站的跨境卖家都会搭配一些社媒平台给自己引流带货&#xff0c;比如说目前很火的TikTok&#xff0c;这也是目前比较有效的一种引流方式。本文将介绍tiktok运营方法以及如何用tiktok云手机规避运营风险。 TikTok是个不错的风口&#xff0c;不过我们在国内想要运营好Tik…