系统架构设计师—系统架构设计篇—软件架构风格
文章目录
- 概述
- 经典体系结构风格
- 数据流风格
- 批处理
- 管道过滤器
- 对比
- 调用/返回风格
- 主程序/子程序
- 面向对象架构风格
- 层次架构风格
- 独立构件风格
- 进程通信
- 事件驱动的系统
- 虚拟机风格
- 解释器
- 基于规则的系统
- 仓库风格(数据共享风格)
- 数据库系统
- 黑板系统
- 超文本系统
- 闭环控制风格
- C2风格
- 二层C/S架构风格
- 三层C/S架构风格
- B/S架构
概述
软件体系结构(架构)风格是描述某一特定应用领域中系统组织方式的惯用模式。
体系结构风格定义一个系统家族,即一个体系结构定义一个词汇表和一组约束。
- 词汇表:包含一些构件和连接件类型。
- 约束:指出系统是如何将这些构件和连接件组合起来的。
体系结构风格反应了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。
经典体系结构风格
- 数据流风格
- 批处理
- 管道过滤器
- 调用/返回风格
- 主程序/子程序
- 面向对象风格
- 层次结构风格
- 独立构件风格
- 进程通信
- 事件驱动的系统
- 虚拟机风格
- 解释器
- 基于规则的系统
- 仓库风格(数据共享风格)
- 数据库系统
- 黑板系统
- 超文本系统
- 闭环控制风格
- C2风格
数据流风格
批处理
- 每一步处理都是独立的,并且每一步是顺序执行的。
- 只有当前一步处理完成,后一步才能开始处理。
- 数据必须是完整的,以整体的方式传递。
- 如:日志分析、计费程序、数据仓库等。
管道过滤器
- 每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。
- 这个过程通常通过对输入流的变换及增量计算来完成,所以在输入被完全消费之前,输出便产生了。
- 如传统的编译期、UNIX管道等。
对比
批处理 | 管道过滤器 |
---|---|
整体数据传送 | 增量数据传送 |
构件粒度大 | 构件粒度小 |
延迟高、实时性差 | 实时性好 |
无并发 | 可并发 |
调用/返回风格
主程序/子程序
- 一般采用单线程控制。
- 把问题划分成若干处理步骤,主程序的正确性取决于他调用的子程序的正确性。
- 如开发语言。
面向对象架构风格
- 数据的标识鄂它们的相应操作被封装起来,对象的行为体现在其接受和请求的动作中。
- 对象具有封装性,一个对象的改变不会影响其他对象。
- 如面向对象开发语言。
层次架构风格
- 每一层为上一层提供服务,使用下一层的服务,只能见到与自己邻接的层。
- 在层次结构中,修改某一层,最多影响其相邻的上下两层(通常只能影响上层)。
- 上层必须指导下层的身份,不能调整层次之间的顺序。
- 如TCP/IP协议。
独立构件风格
主要特点:每个构件都是独立的个体,可以代表一切体现封装的“对象”。
例如:小到代码级的函数、类,大到一个服务端进程、集群、完整的系统。
进程通信
进程间消息传递的方式可以是点对点、异步或同步方式,以及远程过程(方法)调用等。
事件驱动的系统
- 当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。
- 一个事件的触发就导致另一个模块中的过程调用。这是一种隐式调用的方式,优点是为软件复用提供了强大的支持,为构件的维护和演化带来了方便,其缺点是构件放弃了对系统计算的控制。
- 如:断点调试、新闻、公众号等订阅信息。
虚拟机风格
当底层不支持上层时,在两者之间加入一层虚拟机做模拟仿真,消除硬件和软件之间的差异。
- 解题技巧:自定义、灵活
解释器
-
通常包括一个完成解释工作的解释引擎、一个包含将被解释代码的存储区、一个记录解释引擎当前工作状态的数据结构,以及一个记录源代码被解释执行进度的数据结构。
-
缺点是执行效率比较低。
-
如JVM。
-
解题技巧:游戏
基于规则的系统
- 包括规则集、规则解释器、规则/数据选择器和工作内存。
- 一般用在人工智能领域和
决策支持系统(Decision-making Support System, DSS)中。
仓库风格(数据共享风格)
数据库系统
-
构件分为中央共享数据源、独立处理单元。
-
构件控制中央共享数据。
-
如IDE集成开发环境、注册表、剪贴板。
-
一个或多个构件以主动触发的方式以调用顺序去更新共享数据存储区。
黑板系统
-
包括知识源、黑板和控制三个部分。
-
知识源:若干独立计算的不同单元,提供解决问题的知识。知识源响应黑板的变化,也只修改黑板。
-
黑板:一个全局数据库,包含问题域解空间的全部状态,是知识源相互作用的唯一媒介。知识源响应是通过黑板状态的变化来控制的。
-
黑板系统通常应用在对于解决问题没有确定性算法的软件中。
-
如语音识别、信号处理。
-
与数据库系统相反,一个或多个构件由控制单元通知以被动触发的方式以不确定的顺序去更新共享数据存储区。
-
每个构件可能多次参与执行流程,但流程本身无法事先确定。
超文本系统
-
静态网页
-
超文本系统中出现的构件以网状链接方式相互连接,用户可以在构件之间按照人类的思维方式任意跳转到相关构件。
闭环控制风格
闭环(过程)控制是将过程输出的指定属性维护在一个特定的参考值(设定值),将事务处理看成输入、加工、输出、反馈、再输入的一个持续的过程模型。
实例:空调的温度自动调节器(设定值是温度)、定速巡航系统(设定值是速度)。
闭环控制是根据控制对象输出反馈来进行校正的控制方式,它是在测定实际与计划发生偏差时,按定额或标准来进行纠正的。
- 解题技巧:空调的温度调节系统、巡航系统,数据流转允许存在环路,循环过程。
C2风格
C2体系结构风格可以概括为通过连接件绑定在一起按照一组规则运作的并行构件风格。
C2风格中的系统组织规则如下:
- 系统中的构件和连接都有一个顶部和一个底部。
- 构件的顶部应连接到某连接件的底部,构件的底部则应连接到某连接件的顶部。而构件与构件之间的直接连接是不允许的。
- 一个连接件可以和任意数目的其他构件和连接件连接。
- 当两个连接件进行直接连接时,必须由其中一个的底部连接到另一个的顶部。
二层C/S架构风格
二层C/S架构为单一服务器且以局域网为中心,所以难以扩展至大型企业广域网或Internet;软、硬件的组合及集成能力有限。
它的缺点主要有:
- 服务器的负荷太重,难以管理大量的客户机,系统的性能容易变坏。
- 数据安全性不好。客户端可以直接访问服务器,那么客户端上其他程序也可想办法访问服务器,从而使服务器的安全性受到威胁。
三层C/S架构风格
与二层C/S架构相比,在三层C/S架构中,增加了一个应用服务器。可以将整个应用逻辑驻留在应用服务器上,而只有表示层存在于客户机上。这种客户机称为瘦客户机。
三层C/S架构将应用系统分成表示层、功能层、数据层三个部分。
层次 | 功能 |
---|---|
表示层 | 用户接口,检查用户输入的数据,显示输出的数据。 |
功能层 | 业务逻辑层,是将具体的业务处理逻辑编入程序中。 |
数据层 | 对DBMS进行管理和控制。 |
与传统二层C/S架构相比,三层C/S架构具有以下优点:
- 允许合理地划分三层结构,使之在逻辑上保持相对独立性,从而使整个系统的逻辑结构更为清晰,能提高系统的可维护性和可扩展性。
- 允许更灵活、有效地选用相应的平台和硬件系统,使之在处理负荷能力与处理特性上分别适应于结构清晰的三层,并且这些平台和各个组成部分可以都具有良好的可升级性和开放性。
- 系统的各层可以并行开发,各层也可以选择最适合的开发语言,使之能并行且高效的开发,达到较高的性能价格比。对每一层的处理逻辑的开发和维护也会更容易些。
- 利用功能层可以有效地隔离表示层与数据层,未授权的用户难以绕过功能层去利用数据库工具或黑客手段非法的访问数据层,这就为严格的安全性奠定了坚实的基础。
B/S架构
- B/S-浏览器/服务器(Browser/Server)架构是三层C/S架构的一种实现方式,其具体结构为“浏览器/Web服务器/数据库服务器”。
- B/S架构利用WWW浏览器技术,结合浏览器的多种脚本语言,用通用浏览器就实现了原来需要复杂的专用软件才能实现的强大功能,并节约了开发成本。
相关文章:

系统架构设计师—系统架构设计篇—软件架构风格
文章目录 概述经典体系结构风格数据流风格批处理管道过滤器对比 调用/返回风格主程序/子程序面向对象架构风格层次架构风格 独立构件风格进程通信事件驱动的系统 虚拟机风格解释器基于规则的系统 仓库风格(数据共享风格)数据库系统黑板系统超文本系统 闭…...

【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)
文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…...

【Zinx】Day5-Part4:Zinx 的连接属性设置
目录 Day5-Part4:Zinx 的连接属性设置给连接添加连接配置的接口连接属性方法的实现 测试 Zinx-v1.0总结 Day5-Part4:Zinx 的连接属性设置 在 Zinx 当中,我们使用 Server 来开启服务并监听指定的端口,当接收到来自客户端的连接请求…...

【英伟达AI论文】多模态大型语言模型的高效长视频理解
摘要:近年来,基于视频的多模态大型语言模型(Video-LLMs)通过将视频处理为图像帧序列,显著提升了视频理解能力。然而,许多现有方法在视觉主干网络中独立处理各帧,缺乏显式的时序建模,…...

小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡
在微信小程序中,事件分为 冒泡事件 和 非冒泡事件 : 冒泡事件:当一个组件的事件被触发后,该事件会向父节点传递;(如果父节点中也绑定了一个事件,父节点事件也会被触发,也就是说子组…...

全球首款 5G-A 人形机器人发布
全球首款 5G-A 人形机器人于世界移动通信大会(MWC2025)上由中国移动、华为、乐聚联合发布。以下是关于这款机器人的详细介绍: 名称与背景 名称9:这款人形机器人名为 “夸父”,是中国移动、华为与乐聚机器人在 GTI 平台…...

Tomcat 新手入门指南
Tomcat 新手入门指南 Apache Tomcat 是一个开源的 Java Servlet 容器和 Web 服务器,广泛用于部署和运行 Java Web 应用程序。以下是 Tomcat 的入门指南,帮助你快速上手。 1. 安装 Tomcat 步骤 1: 下载 Tomcat 访问 Apache Tomcat 官网。选择适合的版…...

Flink-DataStreamAPI-生成水印
下面我们将学习Flink提供的用于处理事件时间戳和水印的API,也会介绍有关事件时间、流转时长和摄取时间,下面就让我们跟着官网来学习吧 一、水印策略介绍 为了处理事件时间,Flink需要知道事件时间戳,这意味着流中的每个元素都需要…...

【单片机】ARM 处理器简介
ARM 公司简介 ARM(Advanced RISC Machine) 是英国 ARM 公司(原 Acorn RISC Machine) 开发的一种精简指令集(RISC) 处理器架构。ARM 处理器因其低功耗、高性能、广泛适用性,成为嵌入式系统、移动…...

Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程
MethodChannel(方法通道) 用途:实现 双向通信,用于调用原生平台提供的 API 并获取返回结果。 场景:适合一次性操作,如调用相机、获取设备信息等。 使用步骤: Flutter 端:通过 Meth…...

Kafka常用指令(详细)
Kafka常用指令(详细) 启停命令 前台启动 前台启动命令 ./bin/kafka-server-start.sh config/server.properties 后台启动方式1 后台启动命令加上参数-daemon,窗口关闭之后kafka后台程序继续运行 ./bin/kafka-server-start.sh -daemon co…...

供应链工作效率如何提升
提升供应链工作效率可以从以下几个关键方面入手: 1. 优化供应链管理 数据驱动决策:利用AI和大数据分析,提高预测准确性,优化库存管理。供应链可视化:采用ERP(企业资源计划)和SCM(供…...

1-001:MySQL的存储引擎有哪些?它们之间有什么区别?
MySQL 存储引擎 ├── InnoDB(默认引擎) │ ├── 事务支持:支持 ACID 和事务(事务日志、回滚、崩溃恢复) │ ├── 锁机制:支持行级锁,提高并发性能 │ ├── 外键支持:支持外键…...

Java/Kotlin逆向基础与Smali语法精解
1. 法律警示与道德边界 1.1 司法判例深度剖析 案例一:2021年某游戏外挂团伙刑事案 犯罪手法:逆向《王者荣耀》通信协议,修改战斗数据包 技术细节:Hook libil2cpp.so的SendPacket函数 量刑依据:非法经营罪ÿ…...

用AI学编程4——swift学习1
一个swift文件, 整理出swift从入门到精通的所有知识点, 给出注释, 给出这样的swift文件 以下是一个整合了 Swift 从入门到精通的主要知识点的 Swift 文件,包含了基础语法、面向对象编程、异常处理、集合框架、多线程、Lambda 表达…...

数据集构建与训练前准备
训练数据集目录结构与格式 作者笨蛋学法,先将其公式化,后面逐步自己进行修改,读者觉得看不懂可以理解成,由结果去推过程,下面的这个yaml文件就是结果,我们去推需要的文件夹(名字可以不固定,但是…...

在大型语言模型的提示词设计中,system、user和assistant三个角色的区别与联系
在大型语言模型的提示词设计中,system、user和assistant三个角色承担不同的功能,其区别与联系如下: 1. 角色定义与功能 system(系统指令) 作用:设定模型的整体行为、角色定位和任务框架。例如,“你是一位专业的科技作家”或“仅回答与医疗相关的问题”。特点:在多轮对话…...

Zabbix监控进程报警(Zabbix Monitoring Process Alarm)
zabbix监控进程占cpu、内存、磁盘RAID情况 1、cpu达到90%时报警 名称: cpu user percent gt 90% 表达式:{Template OS Linux:system.cpu.util[,idle].avg(1m)}<10 2、内存达到80%时报警 配置—主机(选择监控主机)—监控项—创建监控项 1、创建监控项 名称&…...

p5.js:sound(音乐)可视化,动画显示音频高低变化
本文通过4个案例介绍了使用 p5.js 进行音乐可视化的实践,包括将音频振幅转化为图形、生成波形图。 承上一篇:vite:初学 p5.js demo 画圆圈 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . copy .\node_modules\p5\lib\addons\p5.soun…...

HAL库常用函数
一、通用函数 系统初始化: HAL_Init(): 初始化HAL库和系统时钟(调用前需配置系统时钟源)。 HAL_Delay(uint32_t Delay): 毫秒级阻塞延时(基于SysTick定时器)。 HAL_GetTick(): 获取系统运行时间(毫秒计数…...

【Zinx】Day5-Part3:Zinx 的连接管理
目录 Day5-Part3:Zinx 的连接管理创建连接管理模块将连接管理模块集成到 Zinx 当中将 ConnManager 集成到 Server 当中在 Connection 的工厂函数中将连接添加到 ConnManagerServer 中连接数量的判断连接的删除 补充:连接的带缓冲发包方式补充:…...

C语言:6.20字符型数据练习题
编写程序,输人一行数字字符(用回车结束),每个数字字符 的前后都有空格。 把这一行中的数字转换成一个整数。 例如,若输入(<CR>代表 Enter键):2 4 8 3<CR>则输出 整数:2483。 #include <stdio.h>int main() {char ch;int number 0;printf("请输入一行…...

SpringBoot Test详解
目录 spring-boot-starter-test 1、概述2、常用注解 2.1、配置类型的注解2.2、Mock类型的注解2.3、自动配置类型的注解2.4、启动测试类型的注解2.5、相似注解的区别和联系 3、SpringBootTest和Junit的使用 3.1、单元测试3.2、集成测试 4、MockMvc 4.1、简单示例4.2、自动配置4…...

CDefView::_GetPIDL函数分析之ListView_GetItem函数的参数item的item.mask 为LVIF_PARAM
CDefView::_GetPIDL函数分析之ListView_GetItem函数的参数item的item.mask 为LVIF_PARAM 第一部分: 1: kd> t SHELL32!CDefView::_GetPIDL: 001b:77308013 55 push ebp 1: kd> dv this 0x00000015 i 0n21 …...

Android Retrofit 框架注解定义与解析模块深度剖析(一)
一、引言 在现代 Android 和 Java 开发中,网络请求是不可或缺的一部分。Retrofit 作为 Square 公司开源的一款强大的类型安全的 HTTP 客户端,凭借其简洁易用的 API 和高效的性能,在开发者社区中广受欢迎。Retrofit 的核心特性之一便是通过注…...

项目上传到Gitee过程
在gitee上新建一个仓库 点击“克隆/下载”获取仓库地址 电脑上要装好git 在电脑本地文件夹右键“Git Bash Here” 依次执行如下命令 git init git remote add origin https://gitee.com/qlexcel/stm32-simple.git git pull origin master git add . git commit -m ‘init’…...

DeepSeek R1在医学领域的应用与技术分析(Discuss V1版)
DeepSeek R1作为一款高性能、低成本的国产开源大模型,正在深刻重塑医学软件工程的开发逻辑与应用场景。其技术特性,如混合专家架构(MoE)和参数高效微调(PEFT),与医疗行业的实际需求紧密结合,推动医疗AI从“技术驱动”向“场景驱动”转型。以下从具体业务领域需求出发,…...

数学之快速幂-数的幂次
题目描述 给定三个正整数 N,M,P,求 输入描述 第 1 行为一个整数 T,表示测试数据数量。 接下来的 T 行每行包含三个正整数 N,M,P。 输出描述 输出共 T 行,每行包含一个整数,表示答案。 输入输出样例 示例 1 输入 3 2 3 7 4…...

git subtree管理的仓库怎么删除子仓库
要删除通过 git subtree 管理的子仓库,可以按照以下步骤操作: 1. 确认子仓库路径 首先确认要删除的子仓库的路径,假设子仓库路径为 <subtree-path>。 2. 从主仓库中移除子仓库目录 使用 git rm 命令删除子仓库的目录: …...

学习资料电子版 免费下载的网盘网站(非常全!)
我分享一个私人收藏的电子书免费下载的网盘网站(学习资料为主): link3.cc/sbook123 所有资料都保存在网盘了,直接转存即可,非常的便利! 包括了少儿,小学,初中,中职&am…...