当前位置: 首页 > news >正文

【系统架构设计师】七、设计模式

7.1 设计模式概述

设计经验在实践者之间日益广泛地利用,描述这些共同问题和解决这些问题的方案就形成了所谓的模式。

7.1.1 设计模式的历史

建筑师Christopher Alexander首先提出了模式概念,他将模式分为了三个部分:

  • 特定的情景(Context):模式在何种情况下发生作用;
  • 动机(System of force):问题或预期的目标;
  • 解决方案(Solution):平衡各动机或解决所阐述问题的一个构造或配置。

模式是表示特定的场景、动机、解决方案三个方面关系的一个规则,每个模式描述了一个在特定情景下不断重复发生的问题,以及该问题解决方案的核心所在。
模式既是一个事物又是一个过程,不仅描述该事物本身,而且提出了通过怎样的过程产生该事物。
设计模式的核心是问题描述和解决方案,问题描述说明模式的最佳使用场合及它将如何解决问题,解决方案是用一组类和对象及其结构动动态协来描述的。

20世纪80年代中期,由Ward Cunningham和Kent Beck将其思想引入到软件领域。1995年,E.Gamma,R.Helm,R.Johnson和J.Vlissides 4人合著了Design Patterns: Elements of Object-Roiented Software(设计模式:可复用面向对象软件的基础)这一经典书籍,这四位大师级人物也被称为Gang Of Four(GoF)。

7.1.2 为什么要使用设计模式

设计模式的应用对软件开发有重大的作用:

  • 简化并加快设计
  • 方面开发人员之间的通信
  • 降低风险
  • 有助于转向面向对象技术

而成熟的软件设计模式:

  • 巧妙:设计模式是在大量实践经验的基础上提炼出来的;
  • 通用:设计模式不依赖特定的系统类型、程序设计语言、应用领域;
  • 得到证明:设计模式在实际系统和面向对象系统中已得到了广泛应用;
  • 简单:设计模式提炼了精简的类设计思想;
  • 可重用:设计模式的建档方式使它们非常易于使用;
  • 面向对象:设计模式是用最基本的面向对象机制构造的,并特定强调区分接口和实现、降低各部分之间的依赖、隔离硬件和软件等面向对象设计的特性。

7.1.3 设计模式的组成元素

  • 模式名
  • 问题或意图
  • 情景
  • 动机
  • 解决方案
  • 示例
  • 结果情景
  • 基本原理
  • 相关模式
  • 已知应用

7.1.4 设计模式的分类

设计模式主要用于得到简洁灵活的系统设计,GoF的书中共有23个设计模式,这个模式可以按两个准则来分类:
一是按设计模式的目的划分:创建型、结构型和行为型三种模式;
二是按设计模式的范围划分(根据设计模式作用于类还是作用于对象):类设计模式和对象设计模式。

  • 创建型模式:对对象实例化过程的抽象,它通过采用抽象类所定义的接口,封装了系统中对象如何创建、组合等信息;
  • 结构型模式:主要用于如何组合已有的类和对象以获取更大的结构,一般借鉴封装、代理、集成等概念将一个或多个类或对象进行组合、封装,以提供统一的外部视图或新的功能。
  • 行为型模式:用于对象之间的职责及其提供的服务的分配,描述对象或类的模式、它们之间的通信模式、及对象间协作完成其单一对象无法单独完成的任务。

7.2 设计模式实例

7.2.1 创建型模式(5种)

1、Abstract Factory(抽象工厂)

为创建一系列相关或者相互依赖的对象提供了一个接口。根据给定的相关抽象类,抽象工程模式提供了一个相匹配的具体子类集创建这些抽象类的实例的方法。

2、Builder(构建器)

构建器模式将复杂对象的构建与其表示相分离,这样相同的构造过程可以创建不同的对象。通过指定对象的类型和内容,构建器模式允许客户端对象构建一个复杂对象。客户端可以不受该对象构造的细节的影响。

3、Factory Method(工厂方法)

工厂方法模式定义了创建对象的接口,它允许子类决定实例化哪个类。它允许将实例化的工作交给其他的子类。

4、Prototype(原型)

原型模式允许对象在不了解要创建对象的确切类以及如何创建等细节的情况下创建自定义对象。原型模式使用动态创建对象更加简单,只要将对象类定义成能够复制自身就可以实现。

5、Singleton(单例)

单例模式确保一个类只有一个实例,并且提供了对该类的全局访问入口,它可以确保使用这个类的实例的所有的对象使用相同的实例。

7.2.2 结构型模式(7种)

1、Adapter(适配器)

适配器模式可以充当两个类之间的媒介,它可以转换一个类的接口被另外一个类使用,使得具有不兼容接口的类能够协同使用。

2、Bridge(桥接)

桥接模式可以将一个复杂的组件分成两个独立的但又相关的继承层次结构:功能性的抽象和内部实现。

3、Composite(组合)

组合模式允许创建树型层次结构来改变复杂性,允许结构中的每一个元素操作同一个接口。

4、Decorator(装饰器)

装饰器模式可以在不修改对象外观和功能的情况下添加或者删除对象功能。

5、Facade(外观)

外观模式为子系统中的一组接口提供了一个统一的接口。这个统一的接口允许对象使用该接口与子系统进行通信,从而实现对子系统的访问。

6、Flyweight(享元)

轻量模式可以通过共享对象减少系统中低等级的、详细的对象数目。

7、Proxy(代理)

代理模式为控制对初始对象的访问提供了一个代理或者占位符对象。它的实现可以有多个类型,如:远程代理和虚拟代理等。

7.2.3 行为模式(11种)

1、Chain of Responsibility(责任链)

责任链模式可以在系统中建立一个链,可以让传递的消息在首先接收到它的级别处理,或者定位到可以处理它的对象。

2、Command(命令)

命令模式在对象中封装了请求,这样可以保存命令,将该命令传递给方法以及像任何其他对象一样返回该命令。

3、Interpreter(解释器)

解释器模式可以解释定义其它语法表示的语言,还提供了用于表示解释语言中的语句解释器。

4、Iterator(迭代器)

迭代器模式为集中的有序访问提供了一致的方法,而该集合是独立于基础集合并与之相分离的。

5、Mediator(中介)

中介模式通过引入一个能够管理对象间消息分布的对象,简化了系统中对象间的通信。该模式可以减少对象之间的相互引用,从而提高了对象间的松耦合度。

6、Memento(备忘录)

备忘录模式可以保持对象状态的“快照”,这样对象可以在不向外界公开其内容的情况下返回到它的最初状态。

7、Observer(观察者)

观察者模式为组件向相关接收方广播消息提供了灵活的方法。该模式定义了对象间一到多的依赖关系,这样当对象改变状态时,将自动通知并更新它所有的依赖对象。

8、State(状态)

状态模式允许对象在内部状态变化时,变更其行为,并修改其类。

9、Strategy(策略)

策略模式定义了一组能够用来表示可能行为集合的类,这些行为可以在应用程序中使用,来修改应用程序功能。

10、Template Method(模板方法)

模板方法模式提供了在不重写方法的前提下允许子类重载部分方法的方法。

11、Vistor(访问者)

访问者模式提供了一种方便的、可维护的方法来表示在对象结构元素上要进行的操作。该模式允许在不改变操作元素的类的前提下定义一个新的操作。

相关文章:

【系统架构设计师】七、设计模式

7.1 设计模式概述 设计经验在实践者之间日益广泛地利用,描述这些共同问题和解决这些问题的方案就形成了所谓的模式。 7.1.1 设计模式的历史 建筑师Christopher Alexander首先提出了模式概念,他将模式分为了三个部分: 特定的情景&#xff…...

新工具可绕过 Google Chrome 的新 Cookie 加密系统

一位研究人员发布了一款工具,用于绕过 Google 新推出的 App-Bound 加密 cookie 盗窃防御措施并从 Chrome 网络浏览器中提取已保存的凭据。 这款工具名为“Chrome-App-Bound-Encryption-Decryption”,由网络安全研究员亚历山大哈格纳 (Alexander Hagenah…...

模型拆解(三):EGNet、FMFINet、MJRBM

文章目录 一、EGNet1.1编码器:VGG16的扩展网络 二、EMFINet2.1编码器:三分支并行卷积编码器2.2CFFM:级联特征融合模块2.3Edge Module:突出边缘提取模块2.4Bridge Module:桥接器2.5解码器:深度特征融合解码器…...

齐次线性微分方程的解的性质与结构

内容来源 常微分方程(第四版) (王高雄,周之铭,朱思铭,王寿松) 高等教育出版社 齐次线性微分方程定义 d n x d t n a 1 ( t ) d n − 1 x d t n − 1 ⋯ a n − 1 ( t ) d x d t a n ( t ) x 0 \frac{\mathrm{d}^nx}{\mathrm{d}t^n} a_1(t)\frac{\mathrm{d}^{n-1}x}{\math…...

Python-Celery-基础用法总结-安装-配置-启动

文章目录 1.安装 Celery2.配置 Celery3.启动 Worker4.调用任务5.任务装饰器选项6.任务状态7.定期任务8.高级特性9.监控和管理 Celery 是一个基于分布式消息传递的异步任务队列。它专注于实时操作,但也支持调度。Celery 可以与 Django, Flask, Pyramid 等 Web 框架集…...

vue中的nextTick() - 2024最新版前端秋招面试短期突击面试题【100道】

nextTick() - 2024最新版前端秋招面试短期突击面试题【100道】 🔄 在Vue.js中,nextTick 是一个重要的方法,用于在下次DOM更新循环结束之后执行回调函数。理解 nextTick 的原理和用法可以帮助你更好地处理DOM更新和异步操作。以下是关于 next…...

5G学习笔记三之物理层、数据链路层、RRC层协议

5G学习笔记三之物理层、数据链路层、RRC层协议 物理层位于无线接口协议栈的最底层,作用:提供了物理介质中比特流传输所需要的所有功能。 1.3.1 传输信道的类型 物理层为MAC层和更高层提供信息传输的服务,其中,物理层提供的服务…...

Ubuntu 通过Supervisor 或者 systemd 管理 .Net应用

在 Ubuntu 上安装 .NET 8.0,通过 supervisor 或 systemd 管理 .NET 应用服务,确保应用能够自动启动、运行以及在崩溃时重启。 1. 安装 .NET 8.0 最新的Ubuntu版本已经不需要注册 Microsoft 包存储库了,具体的可以参考微软官方文档安装&…...

超好用的视频剪辑软件分享:10款剪辑软件推荐

视频剪辑软件哪个比较好用?无论是短视频创作者、专业剪辑师,还是影视后期制作团队,选择一款合适的视频剪辑软件至关重要。今天,我将为大家分享几款超好用的视频剪辑软件,并介绍视频剪辑的六大核心流程。 1.影忆 特点&a…...

5G三大应用场景中的URLLC

5G三大应用场景中的URLLC 5G三大应用场景中的URLLC 1 Urllc不是一个独立的技术,更不是一张独立的网络,他是5G所谓的新空口标准NR(New Radio)中,涉及大规模降低时延、提高可靠性的相关技术; 2 Urllc在目前的…...

PyMOL中常用的命令列表

PyMOL中常用的命令列表 PyMOL中常用的命令列表,包括了加载文件、去除水分子、改变颜色、显示样式和图形优化等操作,可以帮助你完成全方位的分子展示设置。 基础命令流程 加载分子结构 load your_file.pdb # 加载PDB文件去除水分子 remove solvent …...

坏块处理 ORA-01578: ORACLE data block corrupted (file # 3, block # 152588)

帮客户检查环境时,发现sysaux表空间的数据文件有坏块,8月25日发生的,备份保留3个月,直接恢复处理。 rman备份log报错如下 RMAN-00571: RMAN-00569: ERROR MESSAGE STACK FOLLOWS RMAN-00571: RMAN-03009: failure of backu…...

像`npm i`作为`npm install`的简写一样,使用`pdm i`作为`pdm install`的简写

只需安装插件pdm-plugin-i即可: pdm plugin add pdm-plugin-i 然后就可以愉快地pdm i了,例如: git clone https://github.com/waketzheng/fast-dev-cli cd fast-dev-cli python -m pip install --user pipx pipx install pdm pdm plugin a…...

DNS域名解析服务器--RHCE

1.DNS简介 DNS ( Domain Name System )是互联网上的一项服务,它作为将域名和 IP 地址相互映射的一个分布式 数据库,能够使人更方便的访问互联网 DNS 系统使用的是网络的查询,那么自然需要有监听的 port 。 DNS 使用的是…...

数据库物化视图的工作原理与Java实现

引言 物化视图(Materialized View)是数据库中一种特殊的对象,它存储了查询结果的物理副本,使得复杂查询的结果可以快速地被访问。本文将详细介绍物化视图的工作原理、技术策略,并提供Java代码示例。 1. 物化视图的基…...

炫酷的登录框!(附源码)

大家想看什么前端效果请留言 预览效果 源码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录页…...

使用Python实现智能生态系统监测与保护的深度学习模型

随着人类活动的增加,生态系统受到的威胁也在不断加剧。为了更好地保护我们的生态环境,智能生态系统监测与保护成为了一项重要的任务。通过深度学习技术,我们可以实现生态系统的自动化监测与管理,从而及时发现和应对环境变化。本文将详细介绍如何使用Python构建一个深度学习…...

Rust 力扣 - 54. 螺旋矩阵

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们只需要一圈一圈的从外向内遍历矩阵&#xff0c;每一圈遍历顺序为上边、右边、下边、左边 我们需要注意的是如果上边与下边重合或者是右边与左边重合&#xff0c;我们只需要遍历上边、右边即可 题解代码 i…...

Flutter 简述(1)

Flutter 简述 简述 Flutter是Google开源的应用框架&#xff0c;只要一套代码兼顾Android、iOS、Web、Windows、macOS和Linux六个平台&#xff0c;它的设计思路可以说更加先进&#xff0c;不像ReactNative每个组件都需要有对应的原生组件实现&#xff0c;而是通过skia或者其他…...

BGP实验--BGP路由反射器

AR1、AR2上的Loopback 1接口分别为10.1.1.1/24、10.2.2.2/24&#xff0c;用于模拟用户网段 所有设备均使用Loopback 0地址为BGP Router ID&#xff0c;AR1与AR2、AR2与AR3、AR3与AR4、AR4与AR2之间基于直连接口建立IBGP对等体关系&#xff0c;其中AR1为AR2的路由反射器客户端&a…...

IMX8QX MEK开发板烧录实战:手把手教你从官方BSP包到定制uuu脚本的全流程

IMX8QX MEK开发板烧录实战&#xff1a;从BSP解析到定制化uuu脚本全指南 拿到一块崭新的IMX8QX MEK开发板时&#xff0c;官方提供的BSP包往往像一座未经探索的金矿——资源丰富但路径复杂。本文将带你深入这座金矿&#xff0c;从文件定位到脚本定制&#xff0c;完成一次完整的烧…...

LabVIEW编程整洁之道:提升代码可读性与可维护性的实战技巧

1. 项目概述&#xff1a;从“能用”到“好用”的进阶之路在LabVIEW这个图形化编程环境里摸爬滚打十几年&#xff0c;我见过太多工程师能把功能做出来&#xff0c;但做出来的程序却像一团乱麻——前面板控件堆叠、程序框图连线交错、结构嵌套深不见底。这样的程序&#xff0c;别…...

告别龟速传输:在AutoDL上利用AutoPanel高效迁移大容量数据集的实战技巧

1. 为什么大容量数据集传输总是慢如蜗牛&#xff1f; 每次在AutoDL上处理大容量数据集时&#xff0c;最让人抓狂的就是漫长的传输等待。我清楚地记得第一次尝试上传15GB图像数据集时的绝望——整整6个小时的等待&#xff0c;期间还因为网络波动失败了两次。后来才发现&#xff…...

谷歌与伊利诺伊大学联手,让AI研究助手学会“反思自己的错误“

这项由伊利诺伊大学厄巴纳-香槟分校与谷歌云AI研究院联合完成的研究&#xff0c;以预印本形式发表于2026年5月11日&#xff0c;论文编号为arXiv:2605.10899&#xff0c;感兴趣的读者可通过该编号检索完整论文。说到底&#xff0c;我们每个人在完成一件复杂任务时&#xff0c;都…...

从原理图到PCB的桥梁:手把手教你用Cadence导出STM32项目的网表与BOM清单

从原理图到PCB的桥梁&#xff1a;手把手教你用Cadence导出STM32项目的网表与BOM清单 在电子设计自动化&#xff08;EDA&#xff09;流程中&#xff0c;从原理图设计到PCB布局的过渡阶段往往是最容易被忽视却又至关重要的环节。许多工程师在完成精美的原理图后&#xff0c;常常因…...

FanControl传感器无法检测?终极修复指南让风扇控制重回正轨

FanControl传感器无法检测&#xff1f;终极修复指南让风扇控制重回正轨 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendi…...

构建Web化配置中心:从环境变量管理到实时热更新的工程实践

1. 项目概述与核心价值最近在折腾一个挺有意思的小项目&#xff0c;叫Laliet/cc-switch-web。乍一看这个标题&#xff0c;可能有点摸不着头脑&#xff0c;但如果你是一个经常需要处理不同环境配置、或者在不同服务之间切换的前端或全栈开发者&#xff0c;这个项目很可能就是你一…...

基于GIS流域水文分析及水库库容计算实践技术

1、GIS水文分析的原理、DEM数据的获取与处理2、基于水文分析的流域边界、河道及分子流域提取3、暴雨情景下流域淹没区快速识别4、基于GIS的水库库容计算...

双足机器人步态规划算法与动平衡控制【附仿真】

✨ 长期致力于双足机器人、步态规划、动平衡控制、运动发散分量、模型预测控制、二次优化、可视化仿真研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09…...

多变量分数阶系统的频域分析与设计【附程序】

✨ 长期致力于多变量系统、频率域、分数阶PID控制、鲁棒控制、参数拟合、参数优化、工具箱、框图法研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基…...