【愚公系列】软考高级-架构设计师 094-软件架构风格
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2023年华为云十佳博主,2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
软件架构风格(Software Architectural Style)是指一组约定、惯用的设计模式和原则,用于定义和描述软件系统的结构和行为。它提供了一种通用的语言和标准,使得开发人员能够以一致和系统化的方式设计和构建软件系统。不同的架构风格适用于不同类型的问题和应用场景。
🚀一、构件
🔎1.软件架构风格
软件架构风格是描述特定应用领域中系统组织方式的惯用模式。它定义了一组系统家族,包括一个架构定义、一个词汇表和一组约束:
- 架构定义:描述系统的整体结构和组织方式。
- 词汇表:包含一些构件(components)和连接件(connectors)类型。
- 约束:指出系统如何将这些构件和连接件组合起来。
简单来说,软件架构风格就是一个模板,规定了特定应用领域中软件系统应该如何构建。
🦋1.1 作用
- 反映领域特性:架构风格反映了某领域中众多系统共有的结构和语义特性。
- 指导模块组织:它指导如何将各个模块和子系统有效地组织成一个完整的系统。
- 设计重用:研究和实践软件架构风格促进了设计的重用。经过实践证实的解决方案可以可靠地用于解决新的问题。
- 架构级复用:架构设计的一个核心问题是能否达到架构级的软件复用,强调对架构设计的重用。
软件架构风格定义了用于描述系统的术语表和一组指导构建系统的规则。这些风格不仅帮助开发人员理解和创建系统,还促进了设计模式和解决方案的复用,提高了软件开发的效率和质量。
架构风格 | 描述 | 代表风格 |
---|---|---|
数据流风格 | 面向数据流,按照一定的顺序从前向后执行程序。 | 批处理序列、管道-过滤器 |
调用/返回风格 | 构件之间存在互相调用的关系,一般是显式的调用。 | 主程序/子程序、面向对象、层次结构、客户端服务器 |
独立构件风格 | 构件之间是互相独立的,不存在显式的调用关系,而是通过某个事件触发、异步的方式来执行。 | 进程通信、事件驱动系统(隐式调用) |
虚拟机风格 | 自定义了一套规则供使用者使用,使用者基于这个规则来开发构件,能够跨平台适配。 | 解释器、基于规则的系统 |
以数据为中心风格 | 以数据为中心,所有的操作都是围绕建立的数据中心进行的。 | 数据库系统、仓库系统、黑板系统 |
🔎2.数据流风格
🦋2.1 批处理序列
批处理序列是一种架构风格,其构件是一系列按照固定顺序执行的计算单元。多个任务按照同步顺序执行,构件之间通过数据传递进行交互。每个处理步骤是一个独立的程序,必须在前一步结束后才能开始。数据以整体的方式传递,必须是完整的。典型的例子包括批量图像处理,如一次性处理大量图像,执行调整大小、添加水印或转换格式等操作。
🦋2.2 管道-过滤器
管道-过滤器是一种架构风格,每个构件都有一组输入和输出。构件读取输入的数据流,经过内部处理,产生输出数据流。前一个构件的输出作为后一个构件的输入,前后数据流相互关联。过滤器是构件,连接件是管道。典型的例子包括文本处理管道,在文本分析中,可以将文本处理划分为分词、词干提取、情感分析等多个阶段,每个阶段都是一个过滤器。早期编译器也采用这种架构,需要一步一步处理。
🦋2.3 区别
批处理序列和管道-过滤器的主要区别在于数据处理方式和执行时机:
- 批处理序列:通常一次性处理大量数据,离线执行,适用于批量处理任务。例如,批量图像处理。
- 管道-过滤器:将任务分解为多个阶段,每个阶段逐个处理数据,通常是实时或近实时执行,适用于可组合和可扩展的任务。例如,文本处理管道。
🔎3.调用/返回风格
🦋3.1 主程序/子程序
在这种架构中,系统按照单线程控制的方式,将问题划分为若干个处理步骤。构件包括主程序和子程序,且子程序通常可以合成为模块。过程调用作为交互机制,充当连接件的角色。主要特点是通过调用来实现各处理步骤的顺序执行和数据传递。
🦋3.2 面向对象
在面向对象的架构中,构件是对象。对象是抽象数据类型的实例,连接件即是对象间交互的方式。对象通过函数和过程的调用来进行交互。这种方法强调数据封装、继承和多态性,通过对象之间的消息传递实现系统功能。
🦋3.3 层次结构
层次结构架构将系统构件分组成一个层次结构。连接件通过定义层间交互的协议来决定层间的互动。每层为上一层提供服务,并使用下一层的服务,只能看到与自己邻接的层。修改某一层最多影响相邻的两层(通常只能影响上层)。其优点是可以将一个复杂问题分解为一个增量步骤序列来实现,但缺点是并不是每个系统都可以轻易划分为分层模式,并且层次调用会影响效率。
🦋3.4 客户端服务器 (C/S)
早期的两层C/S架构模式由三个部分组成:数据库服务器、客户端服务器和网络。服务器负责数据管理,客户端完成用户交互,称之为“胖客户端、瘦服务器”。后来,演变为三层C/S架构,增加了一个应用服务器,分别是表示层、功能层和数据层。表示层负责用户交互,功能层负责业务逻辑处理,数据层负责数据库处理。以上三层独立,互不干扰。
🔎4.独立构件风格
🦋4.1 进程通信
定义:
- 构件:独立的进程
- 连接件:消息传递
特性:
- 构件通常是命名的过程。
- 消息传递的方式可以是点对点、异步或同步方式,以及远程过程(方法)调用等。
- 涉及不同进程或线程之间的通信和数据共享。
- 这些进程可以运行在同一台计算机上,也可以分布在不同的计算机上。
举例:
一个典型的示例是一个多线程的文件下载器,其中一个线程负责下载文件,另一个线程负责监视下载进度。这两个线程需要通过进程通信来共享下载状态信息,以便监视线程可以显示下载进度。
🦋4.2 事件驱动系统(隐式调用)
定义:
- 构件不直接调用一个过程,而是触发或广播一个或多个事件。
- 构件中的过程在一个或多个事件中注册,当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。
举例:
一个典型的示例是图形用户界面(GUI)应用程序。用户的操作(如点击按钮、键盘输入)会生成事件,应用程序的控件或组件会注册事件处理程序来响应这些事件。
优点:
- 为软件复用提供了强大的支持。
- 为构件的维护和演化带来了方便。
缺点:
- 构件放弃了对系统计算的控制,只能被动地控制。
🔎5.虚拟机风格
🦋5.1 解释器
组成部分:
- 解释引擎:完成解释工作的核心组件。
- 代码存储区:包含将被解释的代码。
- 工作状态数据结构:记录解释引擎当前的工作状态。
- 进度数据结构:记录源代码的解释执行进度。
功能:
- 解析和执行一系列指令或命令。
- 将文本或代码解析成可执行的操作。
缺点:
- 执行效率较低。
举例:
编程语言的解释器是最常见的示例。例如,Python解释器会解释和执行Python编写的代码。用户输入一个数学表达式如"2 + 3",解释器会将其解析并执行计算,然后返回结果"5"。
🦋5.2 基于规则的系统
组成部分:
- 规则集:预定义的一组规则或条件。
- 规则解释器:解析和执行规则的组件。
- 规则/数据选择器:选择适用的规则或数据。
- 工作内存:存储当前工作的状态和数据。
应用领域:
- 人工智能领域。
- 决策支持系统(DSS)。
功能:
- 根据一组事先定义的规则或条件来控制系统的行为。
- 实现灵活的业务规则和决策逻辑。
举例:
银行的贷款审批系统。系统使用基于规则的风格,根据客户的信用评分、贷款金额和其他因素来应用一组贷款批准规则。如果满足规则的条件,系统将自动批准或拒绝贷款申请。
🔎6.数据为中心系统
🦋6.1 仓库风格的架构
定义:
- 将数据存储在一个中央仓库或数据库中。
- 各个组件可以从仓库中读取和写入数据。
- 组件之间通过共享数据仓库进行通信和协作。
示例说明:
假设一个天气预报系统具有多个数据源,包括气象站、卫星数据和气象传感器。这些数据源将数据写入共享的中央仓库,然后天气预报应用程序可以定期查询仓库以获取最新的气象信息并生成天气预报。
🦋6.2 黑板风格的架构
定义:
- 类似于一个黑板或公告板,多个独立的组件称为“专家”共享一个公共存储区(黑板)。
- 专家可以读取和写入数据。
- 专家根据黑板上的信息进行推断和决策,适用于解决复杂的非结构化问题。
示例说明:
假设一个医学诊断系统包括放射科医生、心脏专家和内科医生。每个专家可以根据患者的病历信息(例如X光片、心电图和实验室报告)向黑板提交自己的诊断。黑板负责集成各个专家的诊断,并生成最终的诊断结果。
🦋6.3 比较总结
- 仓库风格:强调数据的集中存储和共享,组件通过访问共享的仓库来交互。
- 黑板风格:侧重于多个独立的组件共享一个中央知识存储区,根据共享的信息进行推断和决策。
🔎7.闭环过程控制
闭环控制:当软件被用来操作一个物理系统时,软件与硬件之间可以粗略的表示为一个反馈循环,这个反馈循环通过接受一定的输入,确定一系列的输出,最终使环境达到一个新的状态,适合于嵌入式系统,涉及连续的动作与状态。比如开空调,不会一调到某个温度就马上能到该温度,是逐渐接收室内的温度来变化输出空调的冷气;
🔎8.C2风格
构C2体系结构风格可以概括为:通过连接件绑定在一起的按照一组规则运作的并行构件网络。C2风格中
的系统组织规则如下:
- 系统中的构件和连接件都有一个顶部和一个底部;
- 构件的顶部应连接到某连接件的底部,构件的底部则应连接到某连接件的顶部,而构件与构件之间的直接连接是不
允许的; - 一个连接件可以和任意数目的其它构件和连接件连接;
- 当两个连接件进行直接连接时,必须由其中一个的底部到另一个的顶部。
🚀二、练习
🔎1.题目一
软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式,其中,在批处理风格软件体系结构中,每个处理步骤是一个单独的程序,每一步必须在前一步结束后才能开始,并且数据必须是完整的,以()的方式传递。基于规则的系统包括规则集、规则解释器、规则/数据选择器及()。
A.迭代 B.整体 C.统一格式 D.递增
A.解释引擎 B.虚拟机 C.数据 D.工作内存
题目涉及软件体系结构风格的描述,包括批处理风格和基于规则的系统。我们需要填补两个空白:
-
批处理风格:
- 描述:每个处理步骤是一个单独的程序,每一步必须在前一步结束后才能开始,并且数据必须是完整的,以()的方式传递。
- 选项:A.迭代 B.整体 C.统一格式 D.递增
-
基于规则的系统:
- 描述:包括规则集、规则解释器、规则/数据选择器及()。
- 选项:A.解释引擎 B.虚拟机 C.数据 D.工作内存
批处理风格:
在批处理风格的软件体系结构中,数据传输的方式是需要在每一步处理完成后进行的,并且数据是完整的。这种方式通常被描述为“整体”的方式,因为数据必须在每个步骤完成后以完整的形式被传递到下一个步骤。
因此,第一空应该填入 B.整体。
基于规则的系统:
基于规则的系统包括规则集、规则解释器、规则/数据选择器及工作内存。工作内存用于存储当前工作的状态和数据,是基于规则的系统中的重要组成部分。
因此,第二空应该填入 D.工作内存。
正确答案为:
- B.整体
- D.工作内存
所以,完整的句子应该是:
软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式,其中,在批处理风格软件体系结构中,每个处理步骤是一个单独的程序,每一步必须在前一步结束后才能开始,并且数据必须是完整的,以整体的方式传递。基于规则的系统包括规则集、规则解释器、规则/数据选择器及工作内存。
🔎2.题目二
软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,按照软件架构风格,物联网系统属于()软件架构风格。
A.层次型 B.事件系统 C.数据线 D.C2
题目要求我们根据软件架构风格来判断物联网系统的架构风格。
物联网(Internet of Things, IoT)系统涉及大量的设备和传感器,这些设备和传感器需要协同工作,通常涉及以下几个方面:
- 数据采集:传感器和设备采集数据。
- 数据传输:数据通过网络传输到中央系统或云平台。
- 数据处理:中央系统或云平台对数据进行处理和分析。
- 数据存储:处理后的数据可能会被存储起来用于后续分析或查询。
- 控制与反馈:基于分析结果,系统可能会向设备发送控制指令。
这些特点表明物联网系统通常具有以下架构特征:
- 多层次的结构:从设备层、网络层到应用层。
- 事件驱动:设备之间可能通过事件来触发操作。
- 数据流:数据从采集到处理再到存储和控制,形成一个数据流动的过程。
选项分析
A. 层次型:
- 层次型架构是一种分层的架构风格,常见于需要明确分层管理的系统,如网络协议栈。这种架构可以很好地描述物联网系统的多层次结构。
B. 事件系统:
- 事件系统架构主要是基于事件驱动的机制进行工作,适用于处理事件驱动的应用程序。然而,物联网系统不仅仅是事件驱动,还涉及数据采集、传输、处理等多种功能。
C. 数据线:
- 数据流架构强调数据在系统中的流动和处理,适用于数据处理密集型应用。物联网系统确实涉及大量数据流动,但它不仅仅是数据流动,还有分层的管理和控制。
D. C2:
- C2(Component and Connector)架构是一种组件和连接器架构,适用于需要高度解耦和灵活性的系统。虽然物联网系统也需要灵活性,但C2不是物联网系统的典型架构风格。
根据物联网系统的特点,最符合其描述的架构风格是 层次型,因为物联网系统通常包括多个层次,从设备层到应用层,各层次之间有明确的职责划分。
因此,正确答案是:
A.层次型
🔎3.题目三
🔎4.题目四
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)