【设计模式入门】设计模式全解析:23种经典模式介绍与评级指南(设计师必备)

news2024/9/29 21:25:47

文章目录

  • 设计模式简介
    • 引言
    • 七项基本原则
    • 创建型模式
      • 单例模式(Singleton)
      • 工厂方法模式(Factory Method)
      • 抽象工厂模式(Abstract Factory)
      • 建造者模式(Builder)
      • 原型模式(Prototype)
    • 结构型模式
      • 适配器模式(Adapter)
      • 桥接模式(Bridge)
      • 组合模式(Composite)
      • 装饰器模式(Decorator)
      • 外观模式(Facade)
      • 享元模式(Flyweight)
      • 代理模式(Proxy)
    • 行为型模式
      • 策略模式(Strategy)
      • 模板方法模式(Template Method)
      • 观察者模式(Observer)
      • 命令模式(Command)
      • 迭代器模式(Iterator)
      • 解释器模式(Interpreter)
      • 中介者模式(Mediator)
      • 备忘录模式(Memento)
      • 状态模式(State)
      • 访问者模式(Visitor)
    • 结语
      • 说明

设计模式简介

在这里插入图片描述

引言

设计模式是在软件工程领域中解决常见问题的有效方法。这些模式并不是具体的代码,而是一种通用的解决方案模板,可以帮助开发者在面对相似问题时能够快速地找到解决办法。设计模式通常被分为三大类:创建型、结构型和行为型。

七项基本原则

设计模式遵循若干基本原则,这些原则有助于指导软件设计,提高代码质量和可维护性。以下是设计模式中常用的几大原则:

  1. 单一职责原则(Single Responsibility Principle, SRP)
  • 一个类应该只有一个引起它变化的原因。
  • 通过将类的责任分离到不同的类中,可以提高模块的内聚性和降低模块间的耦合度。
  1. 开放封闭原则(Open/Closed Principle, OCP)
  • 软件实体(类、模块、函数等)应该是可以扩展的,但是不可以修改。
  • 通过继承和多态来实现扩展,而不是通过修改现有代码。
  1. 里氏替换原则(Liskov Substitution Principle, LSP)
  • 子类必须能够替换它们的基类。
  • 任何基类可以出现的地方,子类也一定可以出现。
  1. 依赖倒置原则(Dependency Inversion Principle, DIP)
  • 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
  • 抽象不应该依赖于细节,细节应该依赖于抽象。
  1. 接口隔离原则(Interface Segregation Principle, ISP)
  • 不应该强迫客户端依赖于它不需要的接口。
  • 客户端不应该被迫依赖于它们不使用的接口。
  1. 迪米特法则(Law of Demeter, LoD)
  • 一个对象应该对其他对象有尽可能少的了解。
  • 也称为最少知识原则,提倡减少对象间的相互作用。
  1. 合成复用原则(Composite Reuse Principle, CRP)
  • 尽量使用对象组合,而不是通过继承来达到复用的目的。

这些原则有助于指导开发者编写更加灵活、可扩展和易于维护的代码。在实际应用设计模式时,这些原则可以作为设计决策的重要依据。

创建型模式

创建型模式关注的是对象的创建方式,它们试图找出一个系统化的方法来创建对象,以便使得系统更加灵活。以下是几种典型的创建型模式及其简单介绍和应用场景。

单例模式(Singleton)

  • 简介:确保一个类只有一个实例,并提供一个全局访问点。
  • 应用场景
    • 当需要频繁地创建和销毁一个对象时,使用单例模式可以减少资源消耗。
    • 需要控制资源访问点的情况,例如数据库连接池、日志对象等。
  • 推荐阅读:
    【单例设计模式】揭秘单例模式:从原理到实战的全方位解析(开发者必读)

工厂方法模式(Factory Method)

  • 简介:定义一个创建对象的接口,但允许子类决定实例化哪一个类。
  • 应用场景
    • 当一个类不知道它所必须创建的对象的类的时候。
    • 类确定仅有一个实例需要被创建时,或者希望由子类来指定具体的类时。
  • 推荐阅读:
    【工厂方法模式】深度解析:从原理到实战的全方位指南(开发者必备)

抽象工厂模式(Abstract Factory)

  • 简介:提供一个接口,用于创建相关或依赖对象的家族,而无需指定它们具体的类。
  • 应用场景
    • 需要创建一组相关或相互依赖的对象,但具体类别不确定时。
    • 一个系统要独立于它的产品创建、组合时。
  • 推荐阅读:
    【抽象工厂模式】从理论到实战:构建可扩展的软件家族(设计模式系列)

建造者模式(Builder)

  • 简介:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 应用场景
    • 如果创建复杂对象的算法应该独立于部件的组成部分以及它们的装配方式时。
    • 当对象的构建过程变得复杂,并且需要精细控制创建过程时。

原型模式(Prototype)

  • 简介:通过复制现有对象来创建新对象,而不是通过构造函数实例化。
  • 应用场景
    • 当创建对象的代价比较大时,可以通过复制现有的对象来创建新的对象。
    • 需要动态地获取对象的类信息或者构造函数的信息时。

结构型模式

结构型模式关注于如何组合类或对象以获得新的功能。以下是几种典型的结构型模式及其简单介绍和应用场景。

适配器模式(Adapter)

  • 简介:允许不兼容的接口之间可以协同工作。
  • 应用场景
    • 需要复用一些已有的类,但是接口又与当前系统不兼容时。
    • 想要创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(如那些来自第三方的类)协同工作。

桥接模式(Bridge)

  • 简介:将抽象部分与它的实现部分分离,使它们都可以独立变化。
  • 应用场景
    • 一个类的某些行为需要通过选择不同的实现来改变其表现。
    • 减少抽象和实现这两个可变维度的变化带来的组合爆炸问题。

组合模式(Composite)

  • 简介:将对象组合成树形结构以表示“整体-部分”的层次结构。
  • 应用场景
    • 你想表示对象的部分整体层次结构。
    • 你需要处理同一类型的对象集合,希望客户端不必关心单个对象还是对象组合。

装饰器模式(Decorator)

  • 简介:动态地给一个对象添加一些额外的职责。
  • 应用场景
    • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
    • 当不能采用继承的方法进行扩充时。

外观模式(Facade)

  • 简介:为子系统中的一组接口提供一个一致的界面,简化了客户端与系统的交互。
  • 应用场景
    • 客户端不需要知道子系统的细节,只需要一个简单的接口。
    • 当一个系统有多个子系统,每个子系统都有自己的接口,需要一个统一的接口来简化外部调用。

享元模式(Flyweight)

  • 简介:运用共享技术有效地支持大量细粒度的对象。
  • 应用场景
    • 一个应用系统有大量的细粒度对象。
    • 使用共享技术有助于减少内存中的对象数量。

代理模式(Proxy)

  • 简介:为其他对象提供一个代理以控制对这个对象的访问。
  • 应用场景
    • 在访问一个对象时执行一些附加操作,比如缓存、日志记录、权限检查等。
    • 控制对远程对象的访问,或者当直接访问对象开销过大时。

行为型模式

行为型模式关注于对象之间的职责分配以及通信机制。以下是几种典型的结构型模式及其简单介绍和应用场景。

策略模式(Strategy)

  • 简介:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。
  • 应用场景
    • 当一个系统应该动态地在几种算法中选择一种时。
    • 算法的实现细节不应该影响客户端。

模板方法模式(Template Method)

  • 简介:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
  • 应用场景
    • 一次性写出基本的算法框架,而将算法的具体步骤留给子类去实现。
    • 各个子类中公共的行为可以从父类中得到。

观察者模式(Observer)

  • 简介:当对象状态改变时通知所有依赖它的对象。
  • 应用场景
    • 当一个对象状态发生改变时,所有的依赖对象都需要得到通知并自动更新。
    • 实现事件监听器、发布订阅模式等。

命令模式(Command)

  • 简介:将一个请求封装为一个对象,从而使用户可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
  • 应用场景
    • 将请求封装为对象后,可以方便地实现撤销/重做、事务等机制。
    • 当需要在不同的时刻指定请求、将请求排队、传递请求、执行请求时。

迭代器模式(Iterator)

  • 简介:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
  • 应用场景
    • 遍历集合时,不需要暴露集合的内部结构。
    • 支持多种遍历方式。

解释器模式(Interpreter)

  • 简介:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
  • 应用场景
    • 当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树时。
    • 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题定义为一种语言,并开发一个解释器来解释该语言。

中介者模式(Mediator)

  • 简介:用一个中介对象来封装一系列的对象交互。
  • 应用场景
    • 当一组对象以定义良好但是复杂的方式进行通信时,产生的相互依赖关系结构混乱且难以理解。
    • 当对象之间存在复杂的引用时,为了降低类之间的耦合。

备忘录模式(Memento)

  • 简介:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复它。
  • 应用场景
    • 需要保存和恢复数据的相关状态(如游戏存档),但不能让其他对象访问其状态。
    • 需要为用户提供撤销功能。

状态模式(State)

  • 简介:允许一个对象在其内部状态改变时改变它的行为。
  • 应用场景
    • 对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
    • 控制对象的行为受到它所处状态的影响,并且代码必须因此与各个状态条件相关联。

访问者模式(Visitor)

  • 简介:主要将数据结构与数据操作分离。
  • 应用场景
    • 一个对象结构包含很多类对象,它们有不同的操作需要被执行,而且这些操作依赖这些对象的类。
    • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而我们需要避免让这些操作“污染”这些对象的类。

结语

设计模式是软件开发中非常重要的概念,它们为开发者提供了解决问题的思路和经验。熟练掌握这些模式能帮助开发者编写出更灵活、更易于维护的代码。当然,这只是一个简短的介绍,每种模式背后都有着更为丰富的细节和技术要点,值得进一步探索。

下面是一个基于学习难度和使用频率两个维度来评估设计模式的表格。学习难度和使用频率都用星号来表示等级,其中星号越多表示等级越高。需要注意的是,这些等级是主观评估的结果,可能会因人而异。以下是23种设计模式的学习难度和使用频率等级:

设计模式学习难度使用频率
单例模式★★★★★★
工厂方法模式★★★★★
抽象工厂模式★★★★★
建造者模式★★★★★
原型模式★★
适配器模式★★★★★
桥接模式★★★★★
组合模式★★★★★
装饰器模式★★★★★
外观模式★★★★★
享元模式★★★
代理模式★★★★★
策略模式★★★★★
模板方法模式★★★★★
观察者模式★★★★★★★
命令模式★★★★★
迭代器模式★★★★
解释器模式★★★★
中介者模式★★★★★
备忘录模式★★★
状态模式★★★★★
访问者模式★★★★

说明

  • 学习难度:

    • ★:非常容易理解和实现。
    • ★★:相对容易理解和实现。
    • ★★★:中等到较高难度,需要一定的编程经验和理解。
    • ★★★★:较难理解和实现,通常涉及到较为复杂的概念或架构。
  • 使用频率:

    • ★:很少使用,只在特定场景下适用。
    • ★★:偶尔使用,在特定条件下有用。
    • ★★★:经常使用,适用于多种场景。
    • ★★★★:非常常用,几乎每个项目都会用到。

请注意,这些等级是根据一般经验和实践给出的大致估计,并非严格的标准。实际应用中,这些模式的使用频率和学习难度可能会有所不同。


希望这篇文章能够为你提供一个好的起点!如果你想要深入了解每一种模式的具体实现和应用场景,我后面会为每种模式单独写一篇文章供大家参考和学习。

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

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

相关文章

文件夹图标变白色无法打开:高效数据恢复指南

在日常使用电脑的过程中,我们可能会遇到一种令人困扰的情况——文件夹图标突然变成白色且无法正常打开。这一现象不仅影响了文件管理的便捷性,还可能意味着重要数据的丢失风险。本文将深入探讨这一现象的原因,并提供一种专业且高效的数据恢复…

一二三应用开发平台应用开发示例(11)——收藏夹功能高代码改造及总结

背景 前面使用低代码配置,把实体配置、库表和模式化的代码生成出来了,实际上是用平台帮忙开发人员把“体力活”给干了。接下来,就需要在此基础上进行个性化逻辑的开发。 文档收藏 完善实体模型 文档收藏夹我们原先配置了三个关键属性&…

【Mind+】掌控板入门教程04 迷你动画片

还记得小时候每天放学必看的动画片吗?还记得那些年陪伴我一起长大的卡通人物吗?勇救爷爷的葫芦娃,我们的朋友小哪吒,相信这些经典的动画形象已经成为了一代人童年的美好回忆。今天就让我们用掌控板来制作一部迷你动画片吧。 项目示…

stm32入门学习10-I2C和陀螺仪模块

(一)I2C通信 (1)通信方式 I2C是一种同步半双工的通信方式,同步指的是通信双方时钟为一个时钟,半双工指的是在同一时间只能进行接收数据或发送数据,其有一条时钟线(SCL)…

代码随想录——买卖股票的最佳时机 IV(Leetcode 188)

题目链接 动态规划 class Solution {public int maxProfit(int k, int[] prices) {int[][] dp new int[prices.length][2 * k 1];// 初始化for(int i 1; i < 2 * k 1; i i 2){dp[0][i] -prices[0];}// dp更新寻找最大利润for(int i 1; i < prices.length; i){…

使用Halcon变换与校正图像

使用Halcon变换与校正图像 文章目录 使用Halcon变换与校正图像1. 二维图像的平移、旋转和缩放1.图像的平移2.图像的旋转3.图像的缩放2. 图像的仿射变换3. 投影变换4 实例&#xff1a;透视形变图像校正 由于相机拍摄的时候可能存在角度偏差&#xff0c;因此实际获得的画面可能会…

(C23/C++23) 语句末尾的标签

文章目录 &#x1f516;前言&#x1f3f7;️ref&#x1f3f7;️标号 &#x1f516;兼容&#x1f3f7;️23标准前&#x1f3f7;️23标准后&#x1f3f7;️原因 &#x1f516;未兼容&#x1f516;END&#x1f31f;关注我 &#x1f516;前言 &#x1f3f7;️ref C23提案复合语句末…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 两数之和绝对值最小(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

基于机器学习和深度学习的时间序列分析和预测(Python)

时间序列数据与其它数据不同主要是因为时间序列数据在时间维度上存在依赖关系&#xff0c;这说明在时间序列数据当中过去的历史数据当中隐藏着一些时间序列数据固有的特性&#xff0c;例如&#xff0c;周期性、趋势性、不规则性等。时间序列预测便是通过不同的方法来捕捉这种规…

【抽象工厂模式】从理论到实战:构建可扩展的软件家族(设计模式系列)

文章目录 Java设计模式系列&#xff1a;抽象工厂模式详解1. 引言抽象工厂模式概述为何选择抽象工厂模式 2. 基础知识回顾Java基础概念复习面向对象编程原则设计模式的原则和目的 3. 抽象工厂模式的定义定义与解释模式的目的与其他工厂模式的区别 4. 抽象工厂模式的结构抽象产品…

【Android】数据持久化——数据存储

持久化技术简介 在你打开完成了一份PPT之后关闭程序&#xff0c;再次打开肯定是希望之前的内容还存在在电脑上&#xff0c;一打开PPT&#xff0c;之前的内容就自动出现了。数据持久化就是将那些内存中的瞬时数据保存到存储设备中&#xff0c;保证即使在手机或电脑关机的情况下…

React 学习——别名路径配置(可以使用@代表src),引用文件时使用;联想路径提示

一.别名路径配置 1、安装craco &#xff08;npm i -D craco/craco&#xff09;&#xff1b;安装成功的截图如下&#xff1a; 2、在项目的根目录下创建一个 名为 craco.config.js 文件&#xff1b;&#xff08;必须是根目录下&#xff0c;名称必须和我这个一样&#xff09;&…

C语言调试宏全面总结(六大板块)

C语言调试宏进阶篇&#xff1a;实用指南与案例解析C语言调试宏高级技巧与最佳实践C语言调试宏的深度探索与性能考量C语言调试宏在嵌入式系统中的应用与挑战C语言调试宏在多线程环境中的应用与策略C语言调试宏在并发编程中的高级应用 C语言调试宏进阶篇&#xff1a;实用指南与案…

嵌入式人工智能(44-基于树莓派4B的扩展板-LED按键数码管TM1638)

树莓派性能非常强悍&#xff0c;但是对于某些复杂的项目来说&#xff0c;会出现心有余而口不足的情况&#xff0c;为了解决这类问题&#xff0c;可以在树莓派上使用扩展板&#xff0c;我们介绍几款常见的扩展板&#xff0c;不仅可以扩展到树莓派&#xff0c;其他单片机或嵌入式…

Vue3 列表自动滚动播放(表头固定、列表内容自动滚动播放)+ vue3-seamless-scroll - 附完整示例

vue3-seamless-scroll&#xff1a;Vue3.0 无缝滚动组件&#xff0c;支持Vite2.0&#xff0c;支持服务端打包 目前组件支持上下左右无缝滚动&#xff0c;单步滚动&#xff0c;并且支持复杂图标的无缝滚动&#xff0c;目前组件支持平台与Vue3.0支持平台一致。 目录 效果 一、介绍…

安装vscode -- linux

前言 相信很多人在刚开始使用linux时&#xff0c;不知道怎么安装vscode来辅助我们编程&#xff0c;那么我将在此记录我所用的安装vscode的方法。 安装方法 方法一&#xff1a;snap 第一步&#xff1a;检查软件更新状况 sudo apt update在终端输入上述命令&#xff0c;会提…

大模型学习笔记 - LLM 之RLHF人类对齐的简单总结

LLM - RLHF人类对齐的简单总结 LLM-人类对齐 1. RLHF(Reinforcement Learning from Human Feedback, RLHF),基于人类反馈的强化学习2 奖励模型训练3 强化学习训练 3.1 PPO介绍3.2 进阶的RLHF的介绍 3.2.1. 过程监督奖励模型3.2.2. 基于AI反馈的强化学习3.2.3. 非强化学习的对齐…

卷积神经网络 - 基本卷积函数的变体篇

序言 在深度学习和卷积神经网络&#xff08; CNN \text{CNN} CNN&#xff09;的广阔领域中&#xff0c;基本卷积函数是构建网络结构的基础&#xff0c;它们通过滑动窗口的方式对输入数据进行特征提取。然而&#xff0c;随着应用场景和数据复杂性的增加&#xff0c;单一的卷积方…

苹果Vision Pro生态发展:现状、挑战与未来展望

苹果公司以其创新技术和强大的生态系统闻名于世。在最近的财报会议上,CEO蒂姆库克分享了Vision Pro平台的最新进展,引发了业界的广泛关注。本文将深入探讨Vision Pro生态的现状、面临的挑战以及与其他XR平台的对比分析。 一、Vision Pro生态现状 据库克介绍,Vision Pro平台…

爬1688商品---(测试版)

半成品. from DrissionPage import ChromiumPage import time from selenium import webdriver urlhttps://p4psearch.1688.com/hamlet.html?scene6&cositebaidujj_pz&locationre&trackid885662561117990122602pageChromiumPage()page.get(url)def key_wof():inde…