系统架构设计师—系统架构设计篇—软件架构风格
文章目录
- 概述
- 经典体系结构风格
- 数据流风格
- 批处理
- 管道过滤器
- 对比
- 调用/返回风格
- 主程序/子程序
- 面向对象架构风格
- 层次架构风格
- 独立构件风格
- 进程通信
- 事件驱动的系统
- 虚拟机风格
- 解释器
- 基于规则的系统
- 仓库风格(数据共享风格)
- 数据库系统
- 黑板系统
- 超文本系统
- 闭环控制风格
- 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浏览器技术,结合浏览器的多种脚本语言,用通用浏览器就实现了原来需要复杂的专用软件才能实现的强大功能,并节约了开发成本。
相关文章:
系统架构设计师—系统架构设计篇—软件架构风格
文章目录 概述经典体系结构风格数据流风格批处理管道过滤器对比 调用/返回风格主程序/子程序面向对象架构风格层次架构风格 独立构件风格进程通信事件驱动的系统 虚拟机风格解释器基于规则的系统 仓库风格(数据共享风格)数据库系统黑板系统超文本系统 闭…...
工厂模式加策略模式 -- 具体实现
这里写目录标题 定义接口定义抽象类定义主处理器分支处理器定义工厂demo 定义接口 public interface EntityHandler extends InitializingBean {MatchContentDTO match(MatchEntityDTO matchEntityDTO);String supportEntityType(); }定义抽象类 public abstract class Abstr…...
STM32---FreeRTOS消息队列
一、简介 1、队列简介: 队列:是任务到任务,任务到中断、中断到任务数据交流的一种机制(消息传递)。 FreeRTOS基于队列,实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二值信号量…...
python-leetcode-删掉一个元素以后全为 1 的最长子数组
1493. 删掉一个元素以后全为 1 的最长子数组 - 力扣(LeetCode) 可以使用滑动窗口的方式来解决这个问题。我们要找到最长的全 1 子数组,但必须删除一个元素,因此可以将问题转化为寻找最多包含一个 0 的最长子数组。 解题思路 使用双指针(滑动窗口),维护窗口内最多包含一…...
【赵渝强老师】PostgreSQL的模板数据库
在PostgreSQL中,创建数据库时实际上通过拷贝一个已有数据库进行工作的。在默认情况下,将拷贝名为template1的标准系统数据库。所以该数据库是创建新数据库的“模板”。如果为template1数据库增加对象,这些对象将被拷贝到后续创建的用户数据库…...
vue2中,在table单元格上右键,对行、列的增删操作(模拟wps里的表格交互)
HTML <template><div><divclass"editable-area"v-html"htmlContent"contenteditableblur"handleBlur"contextmenu.prevent"showContextMenu"></div><button click"transformToMd">点击转成M…...
使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏
前言:如今,借助先进的人工智能模型与便捷的云平台,即便是新手开发者,也能开启创意游戏的设计之旅。DeepSeek 作为前沿的人工智能模型,具备强大的功能与潜力,而蓝耘智算云平台则为其提供了稳定高效的运行环境…...
解决微信小程序中调用流式接口,处理二进制数据时 TextDecoder 不兼容的问题
问题复现 最近在开发一个 AI 问答小程序时,由于接口返回的是流式二进制数据,因此我使用了 TextDecoder 的 decode 方法将二进制数据转换为文本。在开发环境中,数据处理一直没有问题,但在真机测试及上线后,发现调用接口…...
DeepSeek与QWQ大模型对比
题目为《deepseek和qwq大模型对比》1000字 DeepSeek与QWQ大模型对比 引言 在人工智能领域,大模型的发展日新月异。DeepSeek和QWQ作为两种具有代表性的大模型,各自在技术架构、应用场景和性能表现上展现出独特优势。本文将从多个维度对这两种模型进行详细…...
Java 大视界 -- Java 大数据在智慧农业农产品质量追溯与品牌建设中的应用(124)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
c++介绍信号六
信号量是c中实现对有限资源访问控制,现成通过信号量获得对资源访问的许可。可用资源大于0,线程可以对资源进行访问,此时计数器减1。当计数器为0时,不可访问资源,线程进入等待。当资源释放时,线程结束等待&a…...
DeepSeek 本地部署全流程指南:畅享专属AI体验
DeepSeek本地部署全流程指南:畅享专属AI体验 一、部署优势剖析 在本地部署DeepSeek大模型,能带来诸多好处。一方面,数据隐私更有保障,所有运算都在本地独立完成,无需联网,有效避免了数据泄露的风险。另一…...
GStreamer —— 2.18、Windows下Qt加载GStreamer库后运行 - “播放教程 6:音频可视化“(附:完整源码)
运行效果 介绍 GStreamer 带有一组将音频转换为视频的元素。他们 可用于科学可视化或为您的音乐增添趣味 player 的本教程展示了: • 如何启用音频可视化 • 如何选择可视化元素 启用音频可视化实际上非常简单。设置相应的标志,当纯音频流为 found&#…...
IP 地址与端口号:网络通信的双重坐标解析
IP 地址与端口号:网络通信的双重坐标解析 在互联网广袤无垠的世界里,数据恰似无数灵动的信息精灵,在复杂的网络脉络中穿梭往来。而确保这些数据能够精准无误地抵达目的地的关键,便是两个至关重要的核心标识符:IP 地址…...
用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏
大家好!今天我将分享如何使用 HTML 和 JavaScript 编写一个简单的飞机游戏。这个游戏的核心功能包括:控制飞机移动、发射子弹、敌机生成、碰撞检测和得分统计。代码简洁易懂,适合初学者学习和实践。 游戏功能概述 玩家控制:使用键…...
【从零开始学习计算机科学】操作系统(三)进程的互斥、同步与通信
【从零开始学习计算机科学】操作系统(三)进程的互斥、同步与通信 进程的互斥、同步与通信进程的互斥进程的同步进程的通信进程的互斥、同步与通信 进程的互斥 两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称…...
Android Compose MutableInteractionSource介绍
在 Android 开发中,Compose 是 Google 推出的现代化 UI 工具包,它让开发者能够更简洁高效地构建应用界面。而 MutableInteractionSource 是 Compose 中一个重要的组件,它可以帮助你处理用户与界面交互时的状态变化,尤其在处理交互…...
[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传
文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点: 面向连接,可靠性高,全双工,面向字节流udp特点:无连接,不…...
Ubuntu 源码安装 Qt5
1.开发背景 Ubuntu 下安装指定版本的 Qt,最新的Qt官方已经不支持 Qt5.15.2 版本以下版本,所以有必要用旧的源码编译 Qt 库。 2.开发需求 源码安装 Qt5.12.2 3.开发环境 开发环境:Ubuntu18.04 目标版本:Qt5.12.2 4.实现步骤 4…...
【NLP 29、项目 Ⅰ:电商评论分类(好评 / 差评) 】
目录 项目介绍 一、训练及测试数据 二、代码实现 1.配置文件 config.py 2.分割训练集和验证集 split_train_valid.py 3.数据加载文件 loader.py Ⅰ、 加载和处理数据 DataGenerator ① 初始化 ② 数据加载 ③ 文本编码 ④ 补齐 / 截断 ⑤ 获取数据集长度和指定索引的数据 Ⅱ、加…...
Linux进程基础知识
1. 什么是进程? 进程就是运行中的程序,是系统资源分配的基本单位 每个进程都有唯一的PID(进程ID) 进程有父子关系,通过ps -ef可以查看 2. 进程的创建 - fork() pid_t pid fork(); - 简单理解:fork()…...
halcon deeplearn 语义分割经验分享 1
本人因为公司遗留问题,为了解决识别错误的问题。尝试过yolo12进行目标检测。初步测试良好但是是halcon的socket通信不行。故而去测试halcon 的deeplearn。自己标注数据。 注: 这个软件使用非常无脑。推荐没有基础的人去用 语义分割 以下是halcon的调用模型 *读取模型 read_dl_…...
从零开始的python学习(五)P75+P76+P77+P78+P79+P80
本文章记录观看B站python教程学习笔记和实践感悟,视频链接:【花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…...
Kylin麒麟操作系统服务部署 | ISCSI存储服务
以下所使用的环境为: 虚拟化软件:VMware Workstation 17 Pro 麒麟系统版本:Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、网络存储结构 网络存储技术(Network Storage Technologies)是基于数据存储的一种通…...
数据结构_单链表
今天我们要开启链表的学习 🖋️🖋️🖋️ 学了顺序表我们可以知道: 🎈链表其实就是争对顺序表的缺点来设计的,补足的就是顺序表的缺点 🎈链表在物理上是上一个节点存放的下一个节点的地址 链表 …...
深陷帕金森困境,怎样重燃生活信心?
帕金森,这个悄然影响无数中老年人生活的神经系统疾病,正逐渐走进大众视野。患病后,患者常出现静止性震颤,安静时手部、下肢不自主抖动,如同在默默诉说着身体的异常。肢体变得僵硬,行动迟缓,起步…...
C语言(23)
字符串函数 11.strstr函数 1.1函数介绍: 头文件:string.h char *strstr ( const char * str1,const char *str2); 作用:在一个字符串(str1)中寻找另外一个字符串(str2)是否出现过 如果找到…...
Docker运行hello-world镜像失败或超时:Unable to find image ‘hello-world:latest‘ locally Trying to pull reposi
Docker运行hello-world镜像失败或超时,报错:Unable to find image ‘hello-world:latest’ locally Trying to pull repository docker.io/library/hello-world … /usr/bin/docker-current: missing signature key. See ‘/usr/bin/docker-current run …...
Linux内核如何和设备树协同工作的?
1.编写设备树 cd arch/riscv/boot/dts/ 再cd到厂商,例如下述内容。 2.编译设备树(dts->dtb)通过dtc命令来转换 3.解析设备树 例如上述内容,都是对设备树的解析。 这里重点说一下内核对设备树的处理吧,因为这个内…...
electron的通信方式(三种)
文章目录 一、渲染进程向主进程发送消息二、渲染进程向主进程发送消息并异步获取结果三、主进程向渲染进程发送消息 electron的主要是主线程和渲染线程之间的通信,简单记录一下三种通信方式 一、渲染进程向主进程发送消息 利用ipcRenderer.send()和ipcMain.on()方法…...
