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

软考 系统架构设计师系列知识点之设计模式(3)

接前一篇文章:软考 系统架构设计师系列知识点之设计模式(2)

所属章节:

老版(第一版)教材

第7章. 设计模式

        第2节. 设计模式实例

2. 结构型模式

结构型模式控制了应用程序较大部分之间的关系。它将以不同的方式影响应用程序,例如Adapter模式允许两个不兼容的系统进行通信,而Facade模式允许在不删除系统中所有可用选项的情况下为用户提供一个简化的界面。结构型模式允许在不重写代码或自定义代码的情况下创建系统。这可以使系统具有增强的重复实用性和应用性能。结构型模式包括:

  • Adapter
  • Bridge
  • Composite
  • Decorator
  • Facade
  • Flyweight
  • Proxy

(1)Adapter(适配器)模式

Adapter模式可以充当两个类之间的媒介,它可以转换一个类的接口,这样就可以被另外一个类使用,这使得具有不兼容接口的类能够协同使用。Adapter模式实现为客户端所知的接口,并且为客户端提供对不为其所知的类实例的访问。Adapter对象可以在不知道实现该接口的类的情况下提供该接口的功能

Adapter模式的优点如下:

  • 允许两个或多个不兼容的对象进行交互和通信。
  • 提高已有功能的重复使用性。

在以下情况中,应该使用Adapter模式:

  • 要使用已有类,而该类接口与所需的接口并不匹配。
  • 要创建可重用的类,该类可以与不相关或未知类进行协作。也就是说,类之间斌不需要兼容接口。
  • 要在一个不同于已知对象接口的接口环境中使用对象。
  • 必须要进行多个源之间的接口转换的时候。

(2)Bridge(桥接)模式

Bridge模式可以将一个复杂的组件分成两个独立的但又相关的继承层次结构功能性的抽象内部实现。改变组件的这两个层次结构很简单,以至于它们可以相互独立地变化。当具有抽象的层次结构和相应的实现层次结构时,Bridge模式是非常有用的。除了可以抽象和实现组合成许多不同的类,该模式还可以以动态组合的独立类的形式实现这些抽象和实现。

一句话概括:桥接模式将类的抽象部分和它的实现部分分离出来,使它们可以独立变化

Bridge模式的优点如下:

  • 可以将接口与实现相分离。
  • 提高了可扩展性。
  • 对客户端隐藏了实现的细节。

在以下情况中,应该使用Bridge模式:

  • 想避免在抽象及其实现之间存在永久的绑定;
  • 抽象及其实现可以使用子类进行扩展。
  • 抽象的实现被改动应该对客户端没有影响;也就是说,不用重新编译代码。

(3)Composite(组合)模式

Composite模式允许创建树型层次结构来改变复杂性,同时允许结构中的每一个元素操作同一个接口。该模式将对象组合成树型结构来表示整个或部分的层次结构。这就意味着Composite模式允许客户端使用单个对象或多个同一对象的组合。

一句话概括:组合模式将对象组合成树型结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性

Composite模式的优点如下:

  • 定义了由主要对象和复合对象组成的类层次结构。
  • 使得添加新的组件类型更加简单。
  • 提供了结构的灵活性和可管理的接口。

在以下情况中,应该使用Composite模式:

  • 想要表示对象的整个或部分的层次结构。
  • 想要客户端能够忽略复合对象和单个对象之间的差异。
  • 结构可以具有任何级别的复杂性,而且是动态的。

(4)Decorator(装饰器)模式

Decorator模式可以在不修改对象外观和功能的情况下添加或者删除对象功能。它可以使用一种对客户端来说是透明的方法来修改对象的功能,也就是使用初始类的子类实例对初始对象进行授权。Decorator模式还为对象动态地添加了额外的责任,这样就在不使用静态集成的情况下,为修改对象功能提供了灵活的选择

一句话概括:装饰器模式动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活

Decorator模式的优点如下:

  • 比静态继承具有更大的灵活性。
  • 避免了特征装载的类处于层次结构的过高级别。
  • 简化了代码,因为用户编写的每一个类都针对功能的一个特定部分,而不用将所有的行为编码到对象中。
  • 改进了对象的扩展性,因为用户可以通过编写新的类来作出改变。

在以下情况中,应该使用Decorator模式:

  • 想要在单个对象中动态并且透明地添加责任,而这样并不会影响其它对象。
  • 想要在以后可能要修改的对象中添加责任。
  • 当无法通过静态子类化实现扩展时。

(5)Facade模式

Facade模式为子系统的一组接口提供了一个统一的接口。因为只有一个接口,该模式就定义了更容易使用子系统的高级接口。这个统一的接口允许对象使用该接口与子系统进行通信,从而实现对子系统的访问。

Facade模式的优点如下:

  • 在不减少系统所提供的选项的情况下,为复杂系统提供了简单接口。
  • 对客户端屏蔽了子系统组件。
  • 提高了子系统与其客户端之间的弱耦合度。
  • 如果每一个子系统使用自身的Facade模式而且系统的其它部分也使用Facade模式与子系统进行通信的话,就可以降低子系统之间的耦合度。
  • 将客户端请求转换后发送给能够处理这些请求的子系统。

在以下情况中,应该使用Facade模式:

  • 想要为复杂的子系统提供简单的接口。
  • 在客户端和抽象的实现类中存在许多依赖关系。
  • 想要对子系统进行分层。

(6)Flyweight模式

Flyweight模式可以通过共享对象减少系统中低等级的、详细的对象数目。如果一个类实例包含用来互换使用的相同信息,Flyweight模式允许程序通过共享一个接口来避免使用多个具有相同信息的实例所带来的的开销。

Flyweight模式的优点如下:

  • 减少了要处理的对象数目。
  • 如果对象能够持续,可以减少内存和存储设备。

在以下情况中,应该使用Flyweight模式:

  • 应用程序使用大量的对象。
  • 由于对象数目巨大,导致很高的存储开销。
  • 应用程序不依赖于对象的身份。

(7)Proxy模式

Proxy模式为控制对初始对象的访问提供了一个代理或者占位符对象。它的实现可以有多种类型,其中Remote Proxy(远程代理)和Virtual Proxy(虚拟代理)是最常见的。

Proxy模式的优点如下:

  • 远程代理可以隐藏对象位于不同的地址空间的事实。
  • 虚拟代理代理可以执行优化操作,例如根据需要创建一个对象。

在以下情况中,应该使用Proxy模式:

  • 需要比简单的指针更灵活、更全面的对象引用。

相关文章:

软考 系统架构设计师系列知识点之设计模式(3)

接前一篇文章:软考 系统架构设计师系列知识点之设计模式(2) 所属章节: 老版(第一版)教材 第7章. 设计模式 第2节. 设计模式实例 2. 结构型模式 结构型模式控制了应用程序较大部分之间的关系。它将以不同…...

217. 存在重复元素、Leetcode的Python实现

博客主页:🏆看看是李XX还是李歘歘 🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今…...

49.Redis缓存设计与性能优化

缓存与数据库双写不一致小概率事件 //线程1 写数据库stock 5 ---------------》更新缓存 //线程2 写数据库stock 4 -----》更新缓存 //线程1 ------》写数据库stock 10 -----》删除缓存 //线程2 ---------------------------------------------------------------------…...

IDEA常用的一些插件

1、CodeGlance 代码迷你缩放图插件,可以快速拖动代码,和VScode一样 2、Codota 代码提示工具,扫描你的代码后,根据你的敲击完美提示。 Codota基于数百万个开源Java程序和您的上下文来完成代码行,从而帮助您以更少的…...

基于定容积法标准容器容积标定中的电动针阀自动化解决方案

摘要:在目前的六氟化硫气体精密计量中普遍采用重量法和定容法两种技术,本文分析了重量法中存在的问题以及定容法的优势,同时也指出定容法在实际应用中还存在自动化水平较低的问题。为了提高定容法精密计量过程中的自动化水平,本文…...

26 行为型模式-命令模式

1 命令模式介绍 2 命令模式原理 3 命令模式实现 模拟酒店后厨的出餐流程,来对命令模式进行一个演示,命令模式角色的角色与案例中角色的对应关系如下: 服务员: 即调用者角色,由她来发起命令. 厨师: 接收者,真正执行命令的对象. 订单: 命令中包含订单 /*** 订单类**/ public cl…...

一个Entity Framework Core的性能优化案例

概要 本文提供一个EF Core的优化案例,主要介绍一些EF Core常用的优化方法,以及在优化过程中,出现性能反复的时候的解决方法,并澄清一些对优化概念的误解,例如AsNoTracking并不包治百病。 本文使用的是Dotnet 6.0和EF…...

【Python 千题 —— 基础篇】列表排序

题目描述 题目描述 给定一个包含无序数字的列表,请将列表中的数字按从小到大的顺序排列,并输出排序后的列表。 输入描述 输入一个包含无序数字的列表。 输出描述 程序将对列表中的数字进行排序,并输出排序后的列表。 示例 示例 ① 1…...

leetcode26:删除有序数组中的重复项

leetcode26&#xff1a;删除有序数组中的重复项 方案一&#xff1a;依次遍历&#xff0c;如果不符合条件则冒泡交换到最后一个位置。o(n^2),结果超时 #include <algorithm> #include <iostream>using namespace std; class Solution { public:int removeDuplicat…...

[FSCTF 2023] web题解

文章目录 源码&#xff01;启动!webshell是啥捏细狗2.0ez_php1Hello,youEZ_eval巴巴托斯&#xff01; 源码&#xff01;启动! 打开题目&#xff0c;发现右键被禁了 直接ctrlu查看源码得到flag webshell是啥捏 源码 <?php highlight_file(__FILE__); $&#x1f600;&qu…...

linux查看内存的方式

1、显示内存状态:free -h  以合适的单位显示内存使用情况&#xff0c;最大为三位数&#xff0c;自动计算对应的单位值。单位有&#xff1a; B bytes K kilos M megas G gigas T teras $free -htotal used free shared buff/cache available Me…...

Python 编写 Flink 应用程序经验记录(Flink1.17.1)

目录 官方API文档 提交作业到集群运行 官方示例 环境 编写一个 Flink Python Table API 程序 执行一个 Flink Python Table API 程序 实例处理Kafka后入库到Mysql 下载依赖 flink-kafka jar 读取kafka数据 写入mysql数据 flink-mysql jar 官方API文档 https://nigh…...

如何 通过使用优先级提示,来控制所有网页资源加载顺序

当你打开浏览器的网络标签时&#xff0c;你会看到大量的活动。资源正在下载&#xff0c;信息正在提交&#xff0c;事件正在记录&#xff0c;等等。 由于有太多的活动&#xff0c;有效地管理这些流量的优先级变得至关重要。带宽争用是真实存在的&#xff0c;当所有请求同时触发时…...

10月25日,每日信息差

今天是2023年10月26日&#xff0c;以下是为您准备的14条信息差 第一、百世集团牵头成立全国智慧物流与供应链行业产教融合共同体在杭州正式成立&#xff0c;该共同体由百世集团、浙江工商大学、浙江经济职业技术学院共同牵头 第二、问界M9预定量突破15000台 第三、前三季度我…...

泛微OA之获取每月固定日期

文章目录 1.需求及效果1.1需求1.2效果 2. 思路3. 实现 1.需求及效果 1.1需求 需要获取每个月的7号作为需发布日期&#xff0c;需要自动填充1.2效果 自动获取每个月的七号2. 思路 1.功能并不复杂&#xff0c;可以用泛微前端自带的插入代码块的功能来实现。 2.将这需要赋值的…...

Dataworks API:调取 MC 项目下所有表单

文章目录 前言Dataworks API 文档解读GetMetaDBTableList 接口文档 API 调试在线调试本地调试运行环境账密问题请求数据进一步处理 小结 前言 最近&#xff0c;我需要对公司的数据资产进行梳理&#xff0c;这其中便包括了Dataworks各个项目下的表单。这些表单&#xff0c;作为…...

Node编写更新用户头像接口

目录 定义路由和处理函数 验证表单数据 ​编辑 实现更新用户头像的功能 定义路由和处理函数 向外共享定义的更新用户头像处理函数 // 更新用户头像的处理函数 exports.updateAvatar (req, res) > {res.send(更新成功) } 定义更新用户头像路由 // 更新用户头像的路由…...

MySQL3:MySQL中一条更新SQL是如何执行的?

MySQL3&#xff1a;MySQL中一条更新SQL是如何执行的&#xff1f; MySQL中一条更新SQL是如何执行的&#xff1f;1.Buffer Pool缓冲池2.Redo logredo log作用Redo log文件位置redo log为什么是2个&#xff1f; 3.Undo log4.更新过程5.InnoDB官网架构InnoDB架构-内存结构①Buffer …...

p5.js map映射

本文简介 带尬猴&#xff0c;我嗨德育处主任 p5.js 为开发者提供了很多有用的方法&#xff0c;这些方法实现起来可能不难&#xff0c;但却非常实用&#xff0c;能大大减少我们的开发时间。 本文将通过举例说明的方式来讲解 映射 map() 方法。 什么是映射 从 p5.js 文档 中可…...

idea提交代码冲突后,代码意外消失解决办法

敲了大半天的代码&#xff0c;解决冲突后&#xff0c;直接消失了当时慌的一批CCCCC 右击项目Local History ----show History 找到最近提交的内容右击选择Revert,代码全回来了...

爬虫批量下载科研论文(SciHub)

系列文章目录 利用 eutils 实现自动下载序列文件 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、获取文献信息二、下载文献PDF文件参考 前言 大家好✨&#xff0c;这里是bio&#x1f996;。…...

explain查询sql执行计划返回的字段的详细说明

当使用EXPLAIN命令查看SQL语句的执行计划时&#xff0c;会返回一张表格&#xff0c;其中包含了该SQL语句的执行计划。下面是每个字段的详细分析&#xff1a; id&#xff1a;执行计划的唯一标识符。如果查询中有子查询&#xff0c;每个子查询都会有一个唯一的ID。在执行计划中&a…...

讯飞输入法13.0发布,推出行业首款生成式AI输入法

&#x1f989; AI新闻 &#x1f680; 讯飞输入法13.0发布&#xff0c;推出行业首款生成式AI输入法 摘要&#xff1a;科大讯飞在2023年全球开发者节上发布了全新讯飞输入法13.0版本&#xff0c;其中最大的亮点是推出了行业首款生成式AI输入法。这次升级将生成式AI能力融入输入…...

35. 搜索插入位置、Leetcode的Python实现

博客主页&#xff1a;&#x1f3c6;看看是李XX还是李歘歘 &#x1f3c6; &#x1f33a;每天分享一些包括但不限于计算机基础、算法等相关的知识点&#x1f33a; &#x1f497;点关注不迷路&#xff0c;总有一些&#x1f4d6;知识点&#x1f4d6;是你想要的&#x1f497; ⛽️今…...

使用 DDPO 在 TRL 中微调 Stable Diffusion 模型

引言 扩散模型 (如 DALL-E 2、Stable Diffusion) 是一类文生图模型&#xff0c;在生成图像 (尤其是有照片级真实感的图像) 方面取得了广泛成功。然而&#xff0c;这些模型生成的图像可能并不总是符合人类偏好或人类意图。因此出现了对齐问题&#xff0c;即如何确保模型的输出与…...

cocosCreator 之 crypto-es数据加密

版本&#xff1a; 3.8.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 简介 项目开发中&#xff0c;针对于一些明文数据&#xff0c;比如本地存储和Http数据请求等&#xff0c;进行加密保护&#xff0c;是有必要的。 关于加密手段主要有&#xff1a; 对称加密 使用相…...

Leetcode---368周赛

题目列表 2908. 元素和最小的山形三元组 I 2909. 元素和最小的山形三元组 II 2910. 合法分组的最少组数 2911. 得到 K 个半回文串的最少修改次数 一、元素和最小的山形三元组I 没什么好说的&#xff0c;不会其他方法就直接暴力&#xff0c;时间复杂度O(n^3)&#xff0c;代…...

矢量图形编辑软件Illustrator 2023 mac中文版软件特点(ai2023) v27.9

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator 2023 mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软…...

一、Docker Compose——什么是 Docker Compose

Docker Compose 是一个用来定义和运行多容器 Docker 应用程序的工具&#xff0c;他的方便之处就是可以使用 YAML 文件来配置将要运行的 Docker 容器&#xff0c;然后使用一条命令即可创建并启动配置好的 Docker 容器了&#xff1b;相比手动输入命令的繁琐&#xff0c;Docker Co…...

Java提升技术,进阶为高级开发和架构师的路线

原文网址&#xff1a;Java提升技术&#xff0c;进阶为高级开发和架构师的路线-CSDN博客 简介 Java怎样提升技术&#xff1f;怎样进阶为高级开发和架构师&#xff1f;本文介绍靠谱的成长路线。 首先点明&#xff0c;只写业务代码是无法成长技术的。提升技术的两个方法是&…...