软考高级之系统架构师之设计模式

概述

设计模式是一种通用的设计方法,实际开发中可能不止23种。为方便理解和应用,一般分为3类:

  • 创建型,通过采用抽象类所定义的接口,封装系统中对象如何创建、组合等信息。工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
  • 结构型:如何组合已有的类和对象以获得更大的结果。适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式
  • 行为型:对象之间的职责及其提供服务的分配方式。责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模版方法模式、访问者模式。

根据处理范围不同,设计模式又可分为类模式和对象模式:

  • 类模式:处理类与子类的关系,通过处理这些关系来建立继承,属于静态关系,在编译时候确定下来;
  • 对象模式:处理对象之间的关系,运行时发生变化,属于动态关系。类模式可以理解为利用继承,对象之间是动态的使用组合的方式,按照设计原则来说,组合优于继承,所以可以尽可能选择对象模式。

创建型

抽象对象的实例化过程,将系统与实例的创建解耦。实例由专门的工厂来实现,从而使系统针对实例的抽象接口编程,不依赖任何接口的实现,从而让使用者不需要关注对象的创建细节

Singleton

单例模式:某个类只能生成一个实例,该类提供一个全局访问点供外部获取该实例,其拓展是有限多例模式。

在这里插入图片描述

Prototype

原型模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。如使用Object类的clone方法,快速复制对象。

FactoryMethod

工厂模式:定义一个用于创建产品的接口,由子类决定生产什么产品。由子类决定要创建的具体类是哪一个。

客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

AbstractFactory

抽象工厂模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关或相互依赖的产品(对象)。允许客户创建对象的家族,而无需指定他的具体类。

Builder

建造者模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。

结构型

结构型模式主要用于处理类和对象的组合,以获得更大的结构。这个概念可以区分大多设计模式,但是也有些比较模糊的,例如:代理模式,既完成组合,也有职责的分配,但是它依赖被归类于结构型

Proxy

代理(Proxy)模式,为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。包装对象,以控制对此对象的访问。

Adapter

适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。封装对象,并提供不同的接口。

Bridge

桥接模式:将类的抽象与实现分离,使它们可以独立变化。用组合关系代替继承关系来实现的,从而降低抽象和实现这两个可变维度的耦合度。可以将接口和实现分离,提高可扩展性,对客户端隐藏实现的细节。

将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

Decorator

装饰模式:动态地给对象增加一些职责,即增加其额外的功能。包装一个对象,以提供新的行为。

装饰器和被装饰的对象有相同的接口,装饰器在使用时获得被装饰的对象,为其增加新的操作。
在这里插入图片描述

Facade

外观模式:门面模式,为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。简化一组类的接口。

外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

Flyweight

享元模式:运用共享技术来有效地支持大量细粒度对象的复用。

元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

Composite

组合模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。

行为型

行为型涉及到算法和对象间职责的分配,它还处理着对象或类之间的通信模式。在程序运行的时候总是流程复杂,需要很好的协调工作,常见行为型模式:

Template Method

模板方法模式:定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。由子类决定如何实现一个算法中的步骤。

模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

Strategy

策略模式:定义一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户;其目的是将行为和环境分隔,当出现新的行为时,只需要实现新的策略类。。封装可以互换的行为,并使用委托来决定要使用哪一个。

Command

命令模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开;从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作。

命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。

Chain of Responsibility

职责链模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。

State

状态模式:允许一个对象在其内部状态发生改变时改变其行为能力。封装基于状态的行为,并使用委托在行为之间切换。

Observer

观察者模式:多个对象间存在一对多的依赖关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。让对象能够在状态改变时被通知。

观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

Mediator

中介者模式:也叫调停者模式,定义一个中介对象来封装简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。

中介者使得各对象不需要现实地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者对象的存在保证了对象结构上的稳定,也就说说系统的结构不会因为新对象的引入带来人量的修改工作。

调停者模式包装一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

Iterator

迭代器模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。支持以不同的方式遍历一个聚合对象。

Visitor

访问者模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。

Memento

备忘录模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适时把这个对象还原到存储起来的状态。

Interpreter

解释器模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。描述如何为语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子,语言指使用规定格式和语法的代码。

实战

某公司开发出一套图形界面显示构件库。基于该库构建图形界面时,用户要求为界面定制一些特效显示,如带滚动条、艺术字体,采用装饰者模式最为灵活。

参考

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PsychoPy Coder 心理学实验 斯特鲁普效应

选题:斯特鲁普效应实验 选题来源:你知道的「有趣的心理学实验」有哪些? - 知乎 (zhihu.com) 测试目标:探索斯特鲁普效应,即被试在判断文字颜色时,当文字的颜色与其所表示的颜色名称不一致时,是…

0基础学习VR全景平台篇 第103篇:使用英文、法文、德文等其他语言

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 蛙色VR平台目前已支持中英文语言进行切换,本期教程为大家带来,如何实现日文、法文、德文、俄文乃至其他小语种离线包里语言切换教程! 语言切换样例展示 一、使用本功…

高级SQL语句

高级SQL语句(进阶查询) 先准备2个表 ,一个location表: use market; create table location(Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New Yor…

【树】树的直径和重心

目录 一.树的直径 (1)定义 (2)思路 (3)例题 (4)std(第一小问) 二.树的重心 (1)介绍 (2)求重心 (3)例…

一文教你搞懂Redis集群

一、Redis主从 1.1、搭建主从架构 单节点的Redis的并发能力是有上限的,要进一步的提高Redis的并发能力,据需要大家主从集群,实现读写分离。 共包含三个实例,由于资源有限,所以在一台虚拟机上,开启多个red…

小程序入门笔记(一) 黑马程序员前端微信小程序开发教程

微信小程序基本介绍 小程序和普通网页有以下几点区别: 运行环境:小程序可以在手机的操作系统上直接运行,如微信、支付宝等;而普通网页需要在浏览器中打开才能运行。 开发技术:小程序采用前端技术进行开发,…

Sentinel安装

Sentinel 微服务保护的技术有很多,但在目前国内使用较多的还是Sentinel,所以接下来我们学习Sentinel的使用。 1.介绍和安装 Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站: 首页 | Se…

Curve 文件存储的缓存策略

Curve 文件存储简介 Curve 文件存储的架构如下: 客户端 Posix 兼容:像本地文件系统一样使用,业务无缝接入,无侵入性; 独立的元数据集群:元数据分布式设计,可以无限扩展。同一文件系统可以在数…

JAVA设计模式-代理模式

一.概念 在软件开发中,也有一种设计模式可以提供与代购网站类似的功能。由于某些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称之为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。 ​ 代理模…

Android自定义Drawable---灵活多变的矩形背景

Android自定义Drawable—灵活多变的矩形背景 在安卓开发中,我们通常需要为不同的按钮设置不同的背景以实现不同的效果,有时还需要这些按钮根据实际情况进行变化。如果采用编写resource中xml文件的形式,就需要重复定义许多只有微小变动的资源…

《视觉 SLAM 十四讲》V2 第 5 讲 相机与图像

文章目录 相机 内参 && 外参5.1.2 畸变模型单目相机的成像过程5.1.3 双目相机模型5.1.4 RGB-D 相机模型 实践5.3.1 OpenCV 基础操作 【Code】OpenCV版本查看 5.3.2 图像去畸变 【Code】5.4.1 双目视觉 视差图 点云 【Code】5.4.2 RGB-D 点云 拼合成 地图【Code】 习题题…

私有云盘:lamp部署nextcloud+高可用集群

目录 一、实验准备: 二、配置mariadb主从复制 三台主机下载mariadb 1)主的操作 2)从的操作 3)测试数据是否同步 三、配置nfs让web服务挂载 1、安装 2、配置nfs服务器 3、配置web服务的httpd 4、测试 四、web 服务器 配…

使用Jest测试Cesium源码

使用Jest测试Cesium源码 介绍环境Cesium安装Jest安装Jest模块包安装babel安装Jest的VSC插件 测试例子小结 介绍 在使用Cesium时,我们常常需要编写自己的业务代码,其中需要引用Cesium的源码,这样方便调试。此外,目前代码中直接使用…

阿里云对象存储OSS SDK的使用

官方文档 https://help.aliyun.com/zh/oss/developer-reference/java 准备工作 windows安装好JDK,这里使用JDK1.8为例 windows安装好IDEA,这里使用IDEA2022 登录阿里云控制台,通过免费试用OSS或开通OSS 步骤 配置访问凭证 有临时和长期…

机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法

机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法 Line Search Newton-CG, Trust Region Newton-CG 往期回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbro…

set和map的封装

目录 介绍 红黑树代码 set insert的迭代器转换问题 为什么会有这样的问题? 如何解决 代码 map 注意点 代码 介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <…

【逐步剖C】-第十一章-动态内存管理

一、为什么要有动态内存管理 从我们平常的学习经历来看&#xff0c;所开辟的数组一般都为固定长度大小的数组&#xff1b;但从很多现实需求来看需要我们开辟一个长度“可变”的数组&#xff0c;即这个数组的大小不能在建立数组时就指定&#xff0c;需要根据某个变量作为标准。…

创建vue3工程

一、新建工程目录E:\vue\projectCode\npm-demo用Visual Studio Code 打开目录 二、点击新建文件夹按钮&#xff0c;新建vue3-01-core文件夹 三、右键vue3-01-core文件夹点击在集成终端中打开 四、初始化项目&#xff0c;输入npm init 一直敲回车直到创建成功如下图 npm init 五…

MATLAB 函数签名器

文章目录 MATLAB 函数签名器注释规范模板参数类型 kind数据格式 type选项的支持 使用可执行程序封装为m函数程序输出 编译待办事项推荐阅读附录 MATLAB 函数签名器 MATLAB 函数签名器 (FUNCSIGN) &#xff0c;在规范注释格式的基础上为函数文件或类文件自动生成函数签名&#…

select完成服务器并发

服务器 #include <myhead.h>#define PORT 4399 //端口号 #define IP "192.168.0.191"//IP地址//键盘输入事件 int keybord_events(fd_set readfds); //客户端交互事件 int cliRcvSnd_events(int , struct sockaddr_in*, fd_set *, int *); //客户端连接事件 …