设计模式全解析(一)——带你搞懂设计模式

2023-11-11

各位朋友,一提到“设计模式”四个字,是不是有一种若隐若现的朦胧感,“我知道设计模式,我知道单例、工厂、观察者、策略...”,但是设计模式到底是什么呢?解决了什么问题呢?接下来我会一步一步解析一下设计模式,以及各个不同的设计模式到底要做的是什么。

我们先看一个完整设计模式的minmap。

是不是看着还挺多的,但其实内容并没有多少,本篇给大家罗列一个大纲,针对每一种设计模式,再单独深入探究讨论,通过实践的形式让设计模式轻快简单易懂。(在此感谢@小傅哥|bugstack.cn 以及其他各位前辈的指导,站在巨人的肩膀上,我们会看的更高更远)

什么是设计模式?

设计模式是一套代码设计【经验的总结】。项目中【合理的】运用设计模式可以【巧妙的解决很多问题】

那么什么是经验的总结呢?是通过几代代码大师无数次的重构优化改进,得到的代码【套路】【合理的】是说要对使用场景有一定的认识,并不是所有代码都要用设计模式来写;【巧妙的解决很多问题】所以才会广泛的应用。通俗的讲,设计模式就是一套套可以提升具体场景下代码执行效率的解决方案

那么知道设计模式有提升效率的功效,那么怎么才能使用设计模式呢?或者说怎么实现设计模式呢?业界总结出设计模式要遵循的六大原则

设计模式六大原则

开闭原则(Open Close Principle)

1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作《面向对象软件构造(Object Oriented Software Construction)》中提出了开闭原则,它的原文是这样:“Software entities should be open for extension,but closed for modification”。
  • 意思:软件模块应该对扩展开放,对修改关闭。
  • 举例:在程序需要进行新增功能的时候,不能去修改原有的代码,而是新增代码,实现一个热插拔的效果(热插拔:灵活的去除或添加功能,不影响到原有的功能)。
  • 目的:为了使程序的扩展性好,易于维护和升级。

里氏代换原则(Liskov Substitution Principle)

  • 意思:里氏代换原则是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
  • 举例:球类,原本是一种体育用品,它的衍生类有篮球、足球、排球、羽毛球等等,如果衍生类替换了基类的原本方法,如把体育用品改成了食用品(那么软件单位的功能受到影响),就不符合里氏代换原则。
  • 目的:对实现抽象化的具体步骤的规范。

依赖倒转原则(Dependence Inversion Principle)

  • 意思:针对接口编程,而不是针对实现编程。
  • 举例:以计算机系统为例,无论主板、CPU、内存、硬件都是在针对接口设计的,如果针对实现来设计,内存就要对应到针对某个品牌的主板,那么会出现换内存需要把主板也换掉的尴尬。
  • 目的:降低模块间的耦合。

接口隔离原则(Interface Segregation Principle)

  • 使用多个隔离的接口,比使用单个接口要好。
  • 举例:比如:登录,注册时属于用户模块的两个接口,比写成一个接口好。
  • 目的:提高程序设计灵活性。

迪米特法则(最少知道原则)(Demeter Principle)

1987年秋天由美国Northeastern University的Ian Holland提出,被UML的创始者之一[Booch]等普及。后来,因为在经典著作《 The Pragmatic Programmer》而广为人知。
  • 意思:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
  • 举例:一个类公开的public属性或方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。
  • 目的:降低类之间的耦合,减少对其他类的依赖。

单一职责原则( Single responsibility principle )

该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中给出的。马丁表示此原则是基于 汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的 内聚性原则发展出的。
  • 意思:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
  • 举例:该原则意思简单到不需要举例!
  • 目的:类的复杂性降低,可读性提高,可维护性提高。

了解了这么多,是不是对设计模式有一点点初步的理解了呢?接下来对设计模式有一个大概的分类,然后逐一深入探讨。

设计模式的分类

设计模式按照具体的功能,可以划分为三个大类别:

  • 创建型模式
  • 结构型模式
  • 行为模式

每一个大类下,包含几种不同的设计模式,具体参照下图。

 

 

 

好了,至此,我们已经初步讲解了设计模式,接下来会对着每一种设计模式,进行逐一的讲解,感谢各位!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式全解析(一)——带你搞懂设计模式 的相关文章

  • 企业架构LNMP学习笔记29

    Nginx负载均衡配置 架构分析 1 用户访问请求Nginx负载均衡服务器 2 Nginx负载均衡服务器再分发请求到Web服务器 实际配置负载均衡 只需修改作为负载均衡服务器的Nginx即可 当前架构中的server04 在客户端解析域名到
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • [C++]外观模式

    外观模式 Facade Pattern 隐藏系统的复杂性 并向客户端提供了一个客户端可以访问系统的接口 这种类型的设计模式属于结构型模式 它向现有的系统添加一个接口 来隐藏系统的复杂性 这种模式涉及到一个单一的类 该类提供了客户端请求的简化
  • 设计模式——State(状态)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 应用举例 4 1 State TcpState 4 2 Context TcpConnection 4 3 ConcreteState ListeningTcp
  • 【微服务架构设计】微服务不是魔术:处理超时

    微服务很重要 它们可以为我们的架构和团队带来一些相当大的胜利 但微服务也有很多成本 随着微服务 无服务器和其他分布式系统架构在行业中变得更加普遍 我们将它们的问题和解决它们的策略内化是至关重要的 在本文中 我们将研究网络边界可能引入的许多棘
  • FastJSON、Jackson、Gson性能测试

    起因是公司原先用的是阿里开源的FastJSON 大家用的也比较顺手 但是在出现了两次严重的漏洞后 公司决定放弃FastJSON 使用其他序列化 反序列化工具 考虑大家常用的无非就是FastJSON Jackson和Gson这三种 因此领导让
  • 4大主流CPU处理器技术架构

    推荐阅读 浅谈linux 内核网络 sk buff 之克隆与复制 深入linux内核架构 进程 线程 了解Docker 依赖的linux内核技术 导读 RISC 精简指令集计算机 是一种执行较少类型计算机指令的微处理器 起源于80年代的MI
  • 测试人员为什么要去了解业务架构和技术架构?

    问题 在入职公司不久 我参加老员工再给新来的员工和管培生宣讲产品的业务 功能 直接拿着功能清单和实际页面在讲解 等把产品功能讲完了 我问了一下实习生和管培生怎么样 他们都说功能讲的太多 太乱 不清楚讲解产品的核心业务逻辑及操作流程 后来发现
  • 项目实战之RabbitMQ冗余双写架构

    作者名称 DaenCode gt https blog csdn net 2302 79094329 作者简介 啥技术都喜欢捣鼓捣鼓 喜欢分享技术 经验 生活 人生感悟 尝尽人生百味 方知世间冷暖 所属专栏 项目所感所想 gt https
  • 深入微服务架构 | 微服务与k8s架构解读

    微服务项目架构解读 什么是微服务 微服务是指开发一个单个小型的但有业务功能的服务 每个服务都有自己的处理和轻量通讯机制 可以部署在单个或多个服务器上 微服务也指一种种松耦合的 有一定的有界上下文的面向服务架构 也就是说 如果每个服务都要同时
  • 单个 epoll + 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景?

    本文是回答一位知友的提问 单个 epoll 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景 不少教程上都提到线程池适合大量的网络短连接的任务场景 但我总感觉这个优势有点站不住脚 单 epoll 线程池模型 主要考虑到
  • 微服务测试是什么?

    微服务测试是一种特殊的 测试类型 因为它涉及到多个独立的服务 以下是进行微服务测试的一般性步骤 1 确定系统架构 了解微服务架构对成功测试至关重要 确定每个微服务的职责 接口 依赖项和通信方式 了解这些信息可以帮助您更好地规划测试用例和测试
  • Java构件技术

    文章目录 Java构件技术 构件及其在信息系统项目中的重要性 常见的Java构件技术和工具 JavaBeans Servlets EJB Spring Framework Spring框架
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • 在AI技术的无情侵袭下,学学Java的23种设计模式还是非常有必要的

    目前国内80 程序员的主要工作是调用组合api实现各种业务需求 在顶层架构师设定好的框架下 做着重复且无聊的编码工作 如果未来ai被广泛应用 那么被替代的风险是很高的 比较扎心的是 其实目前用ai生成片段代码已经是各个公司比较普遍的做法了
  • 什么是微服务

    微服务是一种架构风格 它把一个大型的复杂软件应用划分为一系列小的服务 每个服务都具有单一的功能 运行在其自己的进程中 并通常基于不同的编程语言和框架 这些服务之间通过轻量级通信机制相互通信 这种通信机制基于HTTP协议 微服务架构风格使得系
  • 微服务常见的配置中心简介

    微服务架构中 常见的配置中心包括以下几种 Spring Cloud Config Spring Cloud Config是官方推荐的配置中心解决方案 它支持将配置文件存储在Git SVN等版本控制系统中 通过提供RESTful API 各个
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 【技术科普】什么是达芬奇架构?有什么优势?

    芯片架构是指芯片设计的基本结构和组织方式 用于实现各种计算 存储和通信功能 芯片架构通常包括处理器核心 内存 输入输出接口等组成部分 这些部分的设计对芯片性能和功耗有着直接的影响 世界上主流的芯片架构主要包括x86 ARM PowerPC和
  • [机缘参悟-132] :《洞见》:为什么佛学是真的 -3- 冥想,洞见自己的内心

    目录 一 佛家修行的方法 二 冥想 2 1 冥想步骤 2 2 冥想的好处 2 3 冥想的方法 一 佛家修行的方法 佛教修行是指追求智慧 慈悲和解脱 以最终实现觉悟和解脱的过程 它包含了广泛的修行方法 以下是一些常见的佛教修行方法 冥想 冥想

随机推荐

  • Chaincode之间调用

    API InvokeChaincode 可以一个chaincode中调用另外一个chaincode中的函数 两个chaincode需要安装在相同的peer结点中 如果只需要查询被调链码的世界状态 可以在不同通道中进行 如果涉及更新操作 两个
  • QT中为生成的exe运行文件添加图标

    1 准备好ico图标文件名字为test ico 最好放在和 pro文件同一个文件夹中 2 创建一个叫icon rc的文件 里面写上文本信息IDI ICON1 ICON test ico 保存好 3 在pro文件中添加代码 RC FILE i
  • 09.Javascript设计模式之装饰器模式----Decorator

    09 Javascript设计模式之装饰器模式 Decorator 首先 我非常遗憾的要说一声 我花了两个小时整理的关于装饰器模式的笔记 因为一个不可预期的故障 ADoc文档上传到服务器后 文件损坏了 文件毫无备份 难道是我的笔记中包含法律
  • 数据结构--线性表详解(一)

    这里写链接内容1 前言 线性表是最常用且是最简单的一种数据结构 形如 A1 A2 A3 An这样含有有限的数据序列 我们就称之为线性表 2 线性表的两种表示形式 顺序表示 其实就是数组 链表表示 3 线性表一般操作的介绍 线性表一般包含如下
  • Swift语法学习--实用函数&关键词

    文章目录 abs min max swap filter map reduce Defer guard let 自定义运算符 abs min max swap filter map reduce Defer guard let 自定义运算符
  • 人脸识别系统具有哪些管理功能

    人脸识别系统是一个具有名单管理 资源管理 布控管理 任务管理的多功能系统 主要功能有 1 名单管理 对名单库及库内名单进行管理 支持用户新增 修改 删除名单库 也可以对库内名单进行新增 修改 删除等动作 2 资源管理 对布控点及布控点内的人
  • [学习flex] 1.利用flex实现文字和谐小程序

    灵感来自于09平台dota1 游戏选手对喷时经常互飙国粹 问候对方全家 后来09平台进行了聊天和谐 不和谐的文字都会被 替换 今天我就就用flex实现类似的效果 话不多说上flex代码 脏话 printf 国粹 printf printf
  • BF算法与KMP模式匹配算法(画图详解,C语言实现)

    KMP算法 1 BF算法 1 1BF算法定义 1 2BF算法举例 1 3BF算法代码实现 1 4BF算法性能分析 2 KMP算法 2 1KMP算法与BF算法的区别 2 2求KMP算法next数组 2 3KMP算法的过程举例 2 4KMP算法
  • attr 和 prop 的区别介绍

    attr 和 prop 的区别介绍 对于 HTML 元素本身就带有的固有属性 在处理时 使用 prop 方法 对于 HTML 元素我们自己自定义的 DOM 属性 在处理时 使用 attr 方法 实例 1 a href https www r
  • Cesium设置时间类

    场景时钟类 export default class SceneClock viewer multiplier constructor viewer this viewer viewer 设置场景时钟 param start 开始时间 pa
  • vue+cesium汉化包

    把这个js放进你的项目里面然后调用就可以 我这个是vue项目 然后运用的是es6的导出语法 cesium 可视化部分的中文汉化 包含内容如下 1 汉化方式非从源码层面进行 而是外挂了一个插件执行 使用方便 但是汉化程度不深 只汉化了cesi
  • Introducing Language Guidance in Prompt-based Continual Learning

    本文是LLM系列文章 针对 Introducing Language Guidance in Prompt based Continual Learning 的翻译 基于提示的持续学习中引入语言指导 摘要 1 引言 2 相关工作 3 背景
  • IDE 之 Eclipse安装

    目录 前言 一 Eclipse是什么 二 Eclipse优缺点 1 优点 2 缺点 三 安装Eclipse 1 官方下载Eclipse 2 安装Eclipse 3 运行eclipse 3 1 进入欢迎页面 前言 对于学习java的人来说 E
  • PTA(浙大版《C语言程序设计(第3版)》题目集)习题6-4 使用函数输出指定范围内的Fibonacci数 (20 分)

    PTA 浙大版 C语言程序设计 第3版 题目集 习题6 4 使用函数输出指定范围内的Fibonacci数 20 分 本题要求实现一个计算Fibonacci数的简单函数 并利用其实现另一个函数 输出两正整数m和n 0
  • [科普] 狭义相对论

    本文转载至 http www dlkp gov cn keputiandi universe article dispArticle Asp ID 58 第一章 狭义相对论 一 狭义相对论思想的根源 1 法拉第 麦克斯维将电磁学推向 场 的
  • 支付宝小程序框架分析

    支付宝小程序框架逆向分析 本文对支付宝小程序的正向开发做了简单介绍 并从正向开发的文件类型入手 对小程序的宿主框架进行了逆向分析 包括运行机制 通信模型以及安全防护体系等内容 代码开发 支付宝小程序开发在语法方面与传统的前端网页开发非常类似
  • Python——发送邮件

    一 smtplib模块 主要通过SMTP类与邮件系统进行交互 使用方法如下 1 实例化一个SMTP对象 s smtplib SMTP 邮件服务地址 端口号 s smtplib SMTP SSL 邮件服务地址 端口号 2 登陆邮件 权限验证
  • Linux:全志H3图像codec使用笔记

    1 前言 限于作者能力水平 本文可能存在谬误 因此而给读者带来的损失 作者不做任何承诺 2 图像 codec 概述 图像编解码器 codec 包含 Encoder 和 Decoder 两部分功能 我们用下列分别说明 Encoder 和 De
  • 解决window平台下cocos creator 构建发布面板打开后无法显示问题

    项目场景 creator构建发布界面 问题描述 window平台下cocos creator 构建发布面板打开后无法显示 原因分析 项目的配置文件目录setting和local目录内容混乱可能会导致该问题 这时候后重装creator也是没用
  • 设计模式全解析(一)——带你搞懂设计模式

    各位朋友 一提到 设计模式 四个字 是不是有一种若隐若现的朦胧感 我知道设计模式 我知道单例 工厂 观察者 策略 但是设计模式到底是什么呢 解决了什么问题呢 接下来我会一步一步解析一下设计模式 以及各个不同的设计模式到底要做的是什么 我们先