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

news2024/9/22 11:30:16

目录——阅读所需预计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. 怎么记住他

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

设计模式的分类

此处不展开

创建型模式

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

结构型模式

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

行为模式

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计-----ssm+mysql实现的JavaWeb酒店管理系统

项目介绍 本项目为基于ssmmysql实现的JavaWeb酒店管理系统; 主要功能包括&#xff1a; 管理员登录,收入统计,客房管理,商品管理,客房预订,住宿登记,财务统计,旅客管理,接待对象管理等功能。 环境需要 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上…

解压方法之一 zip

文章目录 解压方法之一 zip语法参数参考实例仅保存文件名更多信息 解压方法之一 zip … _linux-beginner-zip: Linux zip命令的功能是用于压缩文件&#xff0c;解压命令为unzip。 通过zip命令可以将很多文件打包成.zip格式的压缩包&#xff0c;里面会包含文件的名称、路径、…

#define宏定义的初探

前言&#xff1a; 最基本的#define定义方式 #define可以定义宏&#xff0c;这点相信大家并不陌生&#xff0c;其定义的方式十分简单&#xff0c;给大家随便来一个最简单、最基础的定义方式看看&#xff1a; #include<stdio.h> #define a 3 int main() { printf(&quo…

CSAPP cache lab - Optimizing Matrix Transpose

CSAPP cache lab part B 矩阵转置 矩阵转置是一种操作&#xff0c;它将矩阵的行和列互换位置&#xff0c;即将原始矩阵的行变为转置矩阵的列&#xff0c;将原始矩阵的列变为转置矩阵的行。转置操作可以通过改变矩阵的布局来方便地进行某些计算和分析。 假设有一个mn的矩阵A&…

java回溯算法、最短路径算法、最小生成树算法

回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。 最短路径算法 从某顶点出发&#xff0c;沿图的边到达另一顶点所经过的路径中…

autodl学术加速

今天使用autodl加载预训练BERT模型失败&#xff0c;在官方文档里面找到了官方给的代理使用方法。 直接在bash输入&#xff1a; 开启学术加速&#xff1a; source /etc/network_turbo取消学术加速&#xff1a; unset http_proxy && unset https_proxy据说是只能访问这…

.pings勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 随着科技的发展&#xff0c;网络空间中的威胁也日益猖獗&#xff0c;其中之一就是勒索病毒&#xff0c;而.pings 勒索病毒则是其中的一种。本文将深入介绍.pings 勒索病毒的特征、恢复被其加密的数据文件的方法&#xff0c;并提供预防措施&#xff0c;以保障…

Python武器库开发-武器库篇之敏感路径扫描器开发(四十二)

Python武器库开发-武器库篇之敏感路径扫描器开发(四十二) 我们在信息收集的过程中&#xff0c;会发现部署的目标网站之后会有很多的敏感文件&#xff0c;比如说配置文件&#xff08;.cfg)、数据文件(.sql)、目录文件&#xff08;/backup /conf /admin&#xff09;。这些配置的…

WSL使用Ubuntu 20.04版本运行py-bottom-up-attention的记录,及其可能错误的解决方法

文章目录 1. 切换linux的镜像2. 安装gcc3. 查看显卡驱动4. 安装gcc版本5. wsl安装cuda 10.16. 新建虚拟环境8. 安装依赖包9. 运行代码错误运行的所有历史命令如下 WSL使用Ubuntu 20.04版本运行py-bottom-up-attention的记录&#xff0c;及其可能错误的解决方法 github代码地址…

Ubuntu下Lighttpd服务器安装,并支持PHP

1、说明 Lighttpd 是一个德国人领导的开源Web服务器软件&#xff0c;其根本的目的是提供一个专门针对高性能网站&#xff0c;安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销、cpu占用率低、效能好以及丰富的模块等特点。 Lighttpd是众多OpenSource轻量级…

C++力扣题目--94,144,145二叉树非递归(迭代)遍历

为什么可以用迭代法&#xff08;非递归的方式&#xff09;来实现二叉树的前后中序遍历呢&#xff1f; 我们在栈与队列&#xff1a;匹配问题都是栈的强项 (opens new window)中提到了&#xff0c;递归的实现就是&#xff1a;每一次递归调用都会把函数的局部变量、参数值和返回地…

使用 vue-json-viewer 工具在界面显示json格式数据

安装vue-json-viewer npm install vue-json-viewer --save 引入&#xff1a; import JsonViewer from vue-json-viewer Vue.use(JsonViewer) 使用&#xff1a; <json-viewer :value"jsonData" show-double-quotes :preview-mode"true" :show-array…

excel中相同类型的数据归到一起显示

1.选中所有数据 2.开始菜单-排序和筛选-自定义排序 3.选择分类关键字 此处&#xff0c;以属性为例 4.效果 归类后的数据&#xff1a;

JetPack组件学习ViewModel

ViewModel的使用 1.需要先创建ViewModel类&#xff0c;继承自ViewModel重写onclear方法&#xff0c;使得页面销毁的时候能够走到自定义的onClear方法中 class MyViewModel : ViewModel() {//共享数据的核心在于拿到同一个LiveData实例&#xff0c;也就是拿到同一个ViewModel实…

面试算法102:加减的目标值

题目 给定一个非空的正整数数组和一个目标值S&#xff0c;如果为每个数字添加“”或“-”运算符&#xff0c;请计算有多少种方法可以使这些整数的计算结果为S。例如&#xff0c;如果输入数组[2&#xff0c;2&#xff0c;2]并且S等于2&#xff0c;有3种添加“”或“-”的方法使…

商中在线(商务中国)域名外部入库流程

注册商是商中在线&#xff0c;且在商中在线管理的&#xff0c;请使用此教程外部入库。 如您的域名注册商是商中在线但在聚名管理&#xff0c;请参考教程&#xff1a;聚名平台域名外部入库流程 -西部数码帮助中心 一、在我司提交入库 1、在【业务管理】-【域名管理】-【外…

Qt/QML编程学习之心得:一个音频播放器的实现(29)

在window下&#xff0c;打开音乐播放器&#xff0c;然后打开一个.mp3文件&#xff0c;就可以实现播放了&#xff0c;那么在Qt/QML中如何实现呢&#xff1f;首先所有的设计都是基于音乐播放器的&#xff0c;嵌入式linux下同样也有音乐播放器&#xff0c;比如mplayer。其调用方法…

2_工厂设计_工厂方法和抽象工厂

工厂设计模式-工厂方法 1.概念 工厂方法模式(Fatory Method Pattern ) 是指定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例化哪个类&#xff0c;工厂方法让类的实例化推迟到子类中进行。 在工厂方法模式中用户只需要关心所需产品对应的工厂&#xff0c;…

阿里开源AnyText:可在图像中生成任意精准文本,支持中文!

‍随着Midjourney、Stable Difusion等产品的出现&#xff0c;文生图像领域获得了巨大突破。但是想在图像中生成/嵌入精准的文本却比较困难。 经常会出现模糊、莫名其妙或错误的文本&#xff0c;尤其是对中文支持非常差&#xff0c;例如&#xff0c;生成一张印有“2024龙年吉祥…