贯穿设计模式第八话--设计原则总结篇

news/2024/9/11 2:01:31/

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳

从今天开始,将开启一个专栏,【贯穿设计模式】,设计模式是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。为了能更好的设计出优雅的代码,为了能更好的提升自己的编程水准,为了能够更好的理解诸多技术的底层源码, 设计模式就是基石,万丈高楼平地起,一砖一瓦皆根基。 ✨✨欢迎订阅本专栏✨✨

🥺 本人不才,如果文章知识点有缺漏、错误的地方 🧐,也欢迎各位人才们评论批评指正!和大家一起学习,一起进步! 👀

❤️ 愿自己还有你在未来的日子,保持学习,保持进步,保持热爱,奔赴山海! ❤️

💬 最后,希望我的这篇文章能对你的有所帮助! 🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力!

📃 前言回顾


​ 🔥【贯穿设计模式】第一话·设计模式初介绍和单一职责原则🔥

​ 🔥【贯穿设计模式】第二话·设计模式的七大原则之开闭原则🔥

​ 🔥【贯穿设计模式】第三话·设计模式的七大原则之依赖倒转🔥

​ 🔥【贯穿设计模式】第四话·设计模式的七大原则之里氏替换🔥

​ 🔥【贯穿设计模式】第五话·设计模式的七大原则之接口隔离🔥

​ 🔥【贯穿设计模式】第六话·设计模式的七大原则之迪米特法则🔥

​ 🔥【贯穿设计模式】第七话·设计模式的七大原则之合成复用🔥

在第五篇文章中,我们了解设计模式的七大原则中第七个原则: 合成复用原则;

我们来回顾下,它的定义:尽量使用合成/聚合的方式,而不是使用继承,在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过这些对象的委派达到复用已有功能的目的。

并且我们通过学生每学期上课得不同的例子讲述了代码未使用合成复用原则带来的类耦合度增高的问题。

值得注意的是:合成复用原则向我们传达的设计理念是:优先考虑使用“合成”复用,其次在使用“继承”,并不是不使用“继承”。

⚽设计原则总结

今天我们将来总结下学习过的设计原则,以及后续学习设计模式的分类

设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础(即:设计模式为什么这样设计的依据)

设计原则的最主要核心思想:

  1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
  2. 针对接口编程,而不是针对实现编程。
  3. 为了交互对象之间的松耦合设计而努力。

设计模式遵循着这七大原则:

  • 开闭原则是总原则(要求我们对扩展开放,对修改关闭,即抽象架构,扩展实现)
  • 单⼀职责原则(要求我们现类要职责单一,即⼀个类和方法只做⼀件事 )
  • 依赖倒置原则(要求我们要面向接口编程细节,即依赖抽象,下层依赖上层)
  • 里氏替换原则(要求我们不要破坏继承体系,即子类可扩展替代父类)
  • 接口隔离原则(要求我们设计接口的时候要精简单一,即建立单⼀接口)
  • 迪米特法则(要求我们降低类之间的耦合,即对类最少知道,尽量降低耦合)
  • 合成复用原则(要求我们尽量使用合成/复用的方式,即尽量使用组合/聚合的方式)

而设计模式就是通过这七个原则,来指导我们如何做一个好的设计,它是一套方法论,一种高内聚、低耦合的设计思想。当然我们可以在此基础上自由的发挥,甚至设计出符合自己系统的一套设计模式。

当然学习设计模式,必须深入到到某一个特定的业务场景中去,再结合对业务场景的理解和领域模型的建立,才能体会到设计模式思想的精髓;也必须多取了解好的设计模式是如何编写的,好的源码是如何使用到设计模式的,这都是后续需要增加学习的地方。

🏀设计模式分类

不同设计模式的复杂程度、 细节层次以及在整个系统中的应用范围等方面各不相同。 常用的设计模式可以概括为23种,而其中可以按照特点将其分为三大类型:

📫创建型模式

简介:

能够提供创建对象的机制,创建型模式用于解耦对象的实例化过程,增加已有代码的灵活性和可复用性。

包括:

  • 单例模式(确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点)
  • 工厂方法模式(在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型,工厂方法使一个产品类的实例化延迟到其工厂的子类)
  • 抽象工厂模式(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类)
  • 建造者模式(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示)
  • 原型模式(允许一个原型对象再创建另外一个可定制的对象,无需知道如何创建的细节,直接通过克隆的方式创建一个新对象)

📪结构型模式

简介:

用于介绍将类或对象按某种布局组成一个更大的结构,并同时保持结构的灵活和高效。

包括:

  • 代理模式(代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理)
  • 适配器模式(将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作)
  • 装饰模式(不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式)
  • 外观模式(提供一个统一的接口,用来访问子系统中的一群接口)
  • 桥接模式(将抽象与实现分离,使它们可以独立变化)
  • 组合模式(将对象组合成树形结构以表示“部分-整体”的层次结构)
  • 享元模式(用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用)

📬行为型模式

简介:

用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责,负责对象间的高效沟通和职责委派。

包括:

  • 策略模式(针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换)
  • 模板方法模式(抽象类中定义一个操作中算法的骨架,而将算法的一些步骤延迟到子类中)
  • 观察者模式(多个对象间存在一对多的依赖关系,每当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新)
  • 迭代器模式(提供一种方法来访问聚合对象中的一系列数据,而不用暴露这个对象的内部表示)
  • 责任链模式(为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链)
  • 命令模式(将请求转换为一个包含与请求相关的所有信息的独立对象)
  • 备忘录模式(允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态)
  • 状态模式(能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样)
  • 访问者模式(能将算法与其所作用的对象隔离开来)
  • 中介者模式(能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作)

🌸 完结

(注:有些内容或者图片来自https://refactoringguru.cn/design-patterns/catalog)

相信各位看官看到这里大致都对设计模式中的设计原则有了全部了解吧,设计模式原则,其实就是程序员在编程时,应当遵守的原则,也是各种设计模式的基础。

,开闭原则实际上的定义就是扩展开放,对修改关闭,提高软件系统的可复用性及可维护性。

学好设计模式,让你感受一些机械化代码之外的程序设计魅力,也可以让你理解各个框架底层的实现原理。最后,祝大家跟自己能在程序员这条越走越远呀,祝大家人均架构师,我也在努力。 接下来我们就要正式进入设计模式的学习,设计模式也有三大分类,明天我们将要学习的是创建型模式的单例模式 (面试,源码必备的一个重要模式)💪💪💪

文章的最后来个小小的思维导图:

🧐 本人不才,如有什么缺漏、错误的地方,也欢迎各位人才们评论批评指正!🤞🤞🤞

🤩 当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才们给个点赞、收藏下吧,非常感谢!🤗🤗🤗

🥂 虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!✨✨✨

💟 感谢各位看到这里!愿你韶华不负,青春无悔!让我们一起加油吧! 🌼🌼🌼

💖 学到这里,今天的世界打烊了,晚安!🌙🌙🌙


http://www.ppmy.cn/news/44901.html

相关文章

基于Amazon S3的通用封装oss-spring-boot-starter,支持前端分片直传

前段时间使用minio-java封装了一个 minio-spring-boot-starter,但是有局限性,不能很好的支持各个云服务厂商的OSS服务,为此,利用 aws-java-sdk-s3 做一个统一的封装,兼容S3 协议的通用文件存储工具类 ,支持…

23北京邮电大学备考经验

目录【写在前面】本科成绩择校历程英语复习数学复习政治复习专业课复习其它建议笔记复盘压力处理恋爱关系【写在最后】【写在前面】 初试成绩: 本科成绩 总体:浙江某双非学校的软件工程专业、综合测评成绩班级前两名、浙江省省级优秀毕业生、发表过论…

每块硬盘最多可以有几个扩展分区?各个扩展分区最多可以有多少个逻辑驱动器?请高手告知,谢谢!

不同系统,不同分区方案,数量也有不同的。 Linux: 主分区最多4个 逻辑分区: SCSI 最多 16 个 IDE 最多 63 个 传统的分区方案(称为MBR分区方案)是将分区信息保存到磁盘的第一个扇区(MBR扇区)中的64个字节中,每个分区项占用16个字节&#xff0c…

C# 中的泛型

C# 中的泛型 泛型(Generic)是C# 2.0和通用语言运行时(CLR)的一个新特性,泛型为 .Net 框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时不必确定一个或多个参数,具体参数可以等到调用时候的代码声明和实现确定。这意味着使用泛型…

React | React的JSX语法

✨ 个人主页:CoderHing 🖥️ Node.js专栏:Node.js 初级知识 🙋‍♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 11天学会React Node专栏 &#…

多个渠道成功销售的秘诀速递

将您的电子商务业务扩展到多个渠道销售似乎是一项艰巨的任务吗?但如果有了正确的多渠道增长战略,这可能是实现快速增长的好方法。当然,您需要考虑借助一些工具与策略,而SaleSmartly(ss客服)可以为您提供。 …

minio 部署、迁移、使用

一、minio 部署 1、单节点部署 部署IP:192.168.206.10 1.1、下载minio的二进制文件 wget https://dl.min.io/server/minio/release/linux-amd64/minio 1.2、规划磁盘 minio 数据目录一定不能和 跟/ 在一个磁盘上,要单独挂载,比如规划将m…

Netty通信技术进阶二

Netty核心组件 1. Bootstrap2 Channel3. EventLoopGroup 和 EventLoop3.1 eventLoopThreads 是多少? 4. ChannelHandler & ChannelHandlerContext & ChannelPipeline4.1 复用Handler4.2 ChannelInboundHandlerAdapter or SimpleChannelInboundHandler 5. By…

7nm+跨域计算+极致性价比,这家芯片厂商助攻车企「降本增效」

汽车芯片赛道的「卷」,或许超出了所有人的预期。对于单纯TOPS算力的比拼,已经翻篇,如何让车企有的用,用得上,还要用得好,已经是新风向。 实际上,在汽车智能化刚刚开始的2018年,彼时类…

【开懂C++】引用与关键字auto

目录 一.引用1.引用的概念2.引用的使用和问题3.引用与指针的比较二.关键字auto 一.引用 1.引用的概念 引用就是给一个已经存在的变量取一个别名&#xff0c;与变量共用一段内存空间。注意引用的类型必须和变量类型相同&#xff0c;来演示下引用如何使用。 #include <iost…

xshell是什么软件

xshell是什么软件? Xshell 是一个强大的远程管理软件&#xff0c;它支持SSH&#xff0c;TELNET 协议。Xshell可以在Windows下访问远端服务器、路由器、网络机顶盒等&#xff0c;类似的常用软件还有putty&#xff0c;以及Windows下的Telnet。 下面简单介绍一下xshell软件。 X…

面试题React

1.React Fiber是什么&#xff1f; 在 React V16 将调度算法进行了重构&#xff0c; 将之前的 stack reconciler 重构成新版的 fiber reconciler&#xff0c;变成了具有链表和指针的 单链表树遍历算法。通过指针映射&#xff0c;每个单元都记录着遍历当下的上一步与下一步&…

银行数字化转型导师坚鹏:金融数据治理、数据安全政策解读

金融数据治理、数据安全政策解读及大数据应用 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不知道如何准确理解金融数据治理及数据安全相关政策 不清楚金融数据治理及数据安全相关政策对银行有什么影响&#xff1f; 不清楚如何有效应用金融数据治理及数据安…

LeetCode:376. 摆动序列——说什么贪心和动规~

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;376. 摆动序列 题目描述&#xff1a;如果连续数字之间的差严格地在正数…

[golang gin框架] 23.Gin 商城项目-前台templates模板分离,首页,顶部导航,轮播图 左侧分类数据渲染

一.首页界面展示以及项目结构分析 首页界面展示 项目结构分析 二.代码展示 首页相关模型 首页相关模型如下: [golang gin框架] 21.Gin 商城项目-导航模块功能 [golang gin框架] 17.Gin 商城项目-商品分类模块, 商品类型模块,商品类型属性模块功能操作 [golang gin框架] 16.Gin …

科创人·中建三局一公司尹奎:数字化变革能创造全新行业,其意义超越形式、范式创新

尹奎 中建三局一公司技术中心主任 教授级高级工程师&#xff0c;BIM领域资深专家&#xff0c;完成10余个基于BIM的相关研究课题&#xff0c;获省部级以上科技进步奖 13 项&#xff1b;公开出版专著3部&#xff0c;参与编写“十二五”国家重点图书出版规划项目《BIM应用施工》&a…

实现一个登录功能方案设计2

需求MySQL表实现方案 index页面home页面 需求 实现一个登录功能 实现的功能 注册(邮箱注册) 登录(邮箱密码) 重置密码 查看操作记录(登录, 注册, 重置密码, 登出. 都算操作) 登出 在第一版的基础上进行优化:\ 优化点: 存操作信息 请求的post使用中间件进行储存操作信息.避免重复…

门面设计模式

目录 前言&#xff1a; 门面模式的原理与实现 门面模式的应用场景 1. 解决易用性问题 2. 解决性能问题 3.解决分布式事务问题 总结&#xff1a; 参考资料 前言&#xff1a; 相信我们平时的工作多多少少都涉及过接口设计&#xff0c;为了保证接口的可复用性&#xff0c;我…

【论文阅读】ViT阅读笔记

标题 一张图片可以等价于16*16的单词 transformer可以做大规模的图像识别 摘要 虽然现在transformer在nlp上得到广泛运用&#xff0c;但在cv上还没有运用 一般都是cnnattention 现在用transformer用cv的效果特别好 引言 nlp的主流方式&#xff1a;先做预训练&#xff0…

Linux -- 进阶 Web 服务器 基础前瞻 ( 一 )

目录 WWW 简介 &#xff1a; 组件一个网站得需要哪些东西呢 &#xff1f;&#xff1f; 1 得有 响应用户申请网页服务 的软件 2 服务器主机 3 那就需要数据了 4. 浏览器 预备知识 &#xff1a; 网址及HTTP 简介 &#xff1a; URL : http 请求方法 &#xff1a;…