【系统架构设计师】七、设计模式
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首先提出了模式概念,他将模式分为了三个部分: 特定的情景ÿ…...

新工具可绕过 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. 螺旋矩阵
文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们只需要一圈一圈的从外向内遍历矩阵,每一圈遍历顺序为上边、右边、下边、左边 我们需要注意的是如果上边与下边重合或者是右边与左边重合,我们只需要遍历上边、右边即可 题解代码 i…...
Flutter 简述(1)
Flutter 简述 简述 Flutter是Google开源的应用框架,只要一套代码兼顾Android、iOS、Web、Windows、macOS和Linux六个平台,它的设计思路可以说更加先进,不像ReactNative每个组件都需要有对应的原生组件实现,而是通过skia或者其他…...

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

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...