软件架构风格

93 阅读16分钟

架构风格:描述某一特定应用领域系统组织方式惯用模式,反映了领域中众多系统所共有的结构语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。

一个架构定义一个词汇表和一组约束。

词汇表:包含一些构件和连接件类型。

约束:指出系统是如何将这些构件和连接件组合起来的。

架构风格的研究和实践促进对设计的重用

通用的架构风格:1. 数据流风格:批处理序列;管道-过滤器。2. 调用-返回风格:主程序/子程序;面向对象风格;层次结构;客户端/服务器。3. 独立构件风格:进程通信;事件系统。4. 虚拟机风格:解释器;基于规则的系统。
5. 仓库风格:数据库系统;超文本系统;黑板系统。

 架构风格

**架构风格 **定义**代表 **
1. 数据流面向数据流,按照一定的顺序从前向后执行批处理序列管道-过滤器
**2. 调用/返回 **构件之间存在显式互相调用关系, 在系统启动时加载已经在系统内编码,可直接运行。 容易实现并发处理和多任务。 树型结构,削弱了对计算的控制能力。主程序/子程序面向对象层次结构客户端/服务器
**3. 独立构件 **独立构件之间无直接交互(不直接调用一个过程),而是触发/广播一个或多个事件,通过事件驱动的方式实现通信和协作。进程通信基于事件的隐式调用
** 4. 虚拟机 **自定义规则:将业务逻辑中频繁变化的部分(用户级别、折扣规则、机器学习流程)定义为可动态改变的规则,通过灵活的 自定义规则, 实现规则的重组。 基于这个规则来开发构件,能够跨平台适配,业务逻辑随时改变,规则灵活定义、灵活组合。 解释器可以解释执行用户自定义的规则解释器基于规则的系统
**5. 仓库 **以数据为中心,所有的操作都是围绕建立的数据中心进行的数据库系统超文本系统黑板系统

 架构风格的比较与分析** **

架构风格灵活性可扩展性性能
** 解释器**将用户级别、折扣规则定义为可动态改变的规则,通过灵活的 自定义规则, 实现规则的重组。 基于这个规则来开发构件,能够跨平台适配,业务逻辑随时改变,规则灵活定义、灵活组合。 解释器可以解释执行用户灵活自定义的规则(个性化折扣)。折扣规则是独立的语法规则可动态改变,由解释器对变化的规则进行解析,修改更容易。加入新的用户级别和折扣规则时,通过定义新的规则实现可扩展性。解释器是运行期动态绑定执行。 需要对用户级别与折扣规则进行实时解释,性能较差
** 基于规则**
** 面向对象**面向对象的实现相对固定****,高度模块化,将用户级别、折扣规则等封装为对象,业务有变化需要修改具体的类/对象业务逻辑有变化需要修改具体的类/对象。 加入新的用户级别和折扣规则时,需要重新定义新的对象,并需要重启系统在系统启动时加载,用户级别和折扣规则已经在系统内编码,可直接运行,性能较好
** 隐式调用**独立构件之间无直接交互、不直接调用一个过程,而是触发/广播一个或多个事件,通过事件驱动的方式实现通信和协作。 ** 解耦**构件之间的依赖关系,降低耦合度,提升灵活性。支持构件的动态添加和移除。当系统需要新增功能时,可以通过添加监听器或订阅者的方式来扩展系统的功能。能够实现异步、非阻塞的事件处理。 通过处理函数的并发调用,提高系统处理性能。性能较好 ** 事件发布者将事件发布到事件总线上,事件订阅者可以异步处理这些事件,从而提高**系统的并发性和性能。
** 管道-过滤器**流式数据结构,数据驱动机制,处理流程事先确定,顺序或有限循环的交互方式,交互性差。 每个构件都有一组输入和输出,构件读取输入的数据流,经过内部处理产生输出数据流。 数据处理组件之间有依赖关系,前一个构件的输出作为后一个构件的输入,前后数据流关联,灵活性差。数据与处理紧密关联,调整处理流程需要重新启动系统。 接口适配的扩展方法。需要数据格式转换,性能降低。 支持过滤器并发调用,性能提高。
** 仓库**数据存储在中央仓库处理流程独立,独立构件之间无直接交互,通过数据仓库间接交互。 独立构件对中央数据进行操作,支持交互式处理。数据与处理解耦合,可动态添加和删除处理组件。 独立构件与数据仓库进行数据适配数据与处理分离,需要加载数据,性能降低。 数据处理组件之间一般无依赖关系,可并发调用,提高性能。
**比较因素 ****管道-过滤器风格 ****数据仓储风格 **
**数据结构 **流式数据文件或模型
**控制结构 **数据驱动业务功能驱动
**交互方式 **顺序结构、有限循环结构独立构件之间无直接交互,通过数据仓库间接交互
数据处理数据驱动机制,处理流程事先确定,交互性差。数据存储在中央仓库处理流程独立,独立构件对中央数据进行操作,支持交互式处理。
可扩展性数据与处理紧密关联,调整处理流程需要重新启动系统。数据与处理解耦合,可动态添加和删除处理组件。
扩展方法接口适配与数据仓库进行数据适配
处理性能需要数据格式转换,性能降低。 支持过滤器并发调用,性能提高。数据与处理分离,需要加载数据,性能降低。 数据处理组件之间一般无依赖关系,可并发调用,提高性能。

架构案例分析历年真题考点2022      解释器、面向对象2021      解释器、隐式调用、管道-过滤器2020      管道-过滤器、仓库风格
2019      基于规则、面向对象2016      管道-过滤器、仓库风格

**架构风格 ****具体风格名 ****常考案例 **
** 数据流**批处理传统的编译器,词法分析、语法分析等处理过程以独立功能模块的形式存在,程序源代码作为一个整体依次在不同模块中进行传递
管道-过滤器1. 数据输入某个构件,经过内部处理,产生数据输出。 2. 传统的编译器包括词法分析、语法分析、语义分析、代码生成等,每个阶段产生的结果作为下一个阶段的输入
调用-返回主程序/子程序
面向对象
层级结构物联网系统
独立构件进程通信
基于事件的隐式调用1.根据用户的注册兴趣,向用户推送其感兴趣的新闻内容; 2.修改代码后,触发语法高亮、语法错误提示、代码格式化
** 虚拟机 **解释器1. 游戏设计支持自行创建地图,定义游戏对象的行为; 2. 业务灵活组合:将现有的业务功能进行多种组合,形成新的业务功能。 3. 在线游戏系统支持用户自定义游戏对象和行为。 4. 通过拖拽算法组件灵活定义机器学习流程。
基于规则1.社保金的计算方式随国家经济的变化而动态改变; 2.不定期更新VIP会员的审核标准、更新VIP折扣系统; 3.扫地机器人响应突发事件,根据自身状态进行动态调整; 4.针对不同等级的用户提供相应的折扣方案。
** 仓库**数据仓储针对某编程语言的集成开发环境IDE:代码编辑、语法高亮、运行调试,能够实现不同工具之间的信息交互。
黑板语音识别、知识推理、语音搜索:基于先验知识的条件判断;
超文本
闭环过程控制轿车巡航定速,持续测量车辆的实时速度,设定期望速度,控制油门和刹车。
** C2风格**通过连接件绑定在一起,按照一组规则运作的并行构件。 系统中的构件和连接件都有一个顶部和一个底部,顶部 — 底部。

 1. 数据流架构风格** **

批处理架构风格

每个处理步骤是一个单独的程序,每一步必须在前一步结束后才能开始,数据必须是完整的,以整体为单位传递。构件:一系列固定顺序的独立应用程序,构件之间只通过数据传递交互。连接件:某种类型的媒介。

管道-过滤器架构风格

流式数据结构,数据驱动机制, 处理流程事先确定,顺序或有限循环的交互方式,交互性差。每个构件都有一组输入和输出,构件读取输入的数据流,经过内部处理产生输出数据流。数据处理组件之间有依赖关系,前一个构件的输出作为后一个构件的输入,前后数据流关联,灵活性差。前面执行到部分可以开始下一个的执行。数据与处理紧密关联,调整处理流程需要重新启动系统,接口适配的扩展方法。

需要数据格式转换,性能降低。支持过滤器并发调用,性能提高。

不适用于交互性强的应用,对于存在关系的数据流必须进行协调。

适合于系统可划分模块,有清晰的模块接口,具有并发性的场景。

构件:过滤器。

连接件:管道。

 2. 调用-返回架构风格** **


主程序/子程序的架构风格

单线程控制,显式调用,主程序直接调用子程序,过程调用作为交互机制,调用关系具有层次性。容易实现并发处理和多任务。树型结构,削弱了对计算的控制能力。

构件:主程序、子程序。连接件:过程调用。

面向对象的架构风格

面向对象的实现相对固定,高度模块化,将数据和相应的操作封装在对象中,例如将用户级别、折扣规则等封装为对象,业务逻辑有变化需要修改具体的类/对象。加入新的用户级别和折扣规则时,需要重新定义新的对象,并需要重启系统。在系统启动时加载,用户级别和折扣规则已经在系统内编码,可直接运行,性能较好。

构件:对象,通过对象调用封装的方法和属性。连接件:过程调用。

层次型架构风格

层次之间具有调用关系,每层为上一层提供服务,使用下一层的服务,只能见到与自己相邻的层接口。修改某一层,最多只影响其相邻的两层,通常只能影响上层。

划分的层次越多,系统的性能越差。

适合不同层次之间低耦合的系统。

「优点」1. 基于可增加抽象层的设计,分而治之的策略。2. 不同的层次处于不同的抽象级别,核心层封装通用的方法,与业务无关。

  1. 允许每层用不同的方法实现,为软件复用提供支持。

「缺点」1. 很难找到一个合适且正确的层次抽象方法,系统划分层次不容易。2. 层次越多,性能越差。
构件:组成一个层次结构。连接件:通过决定层间如何交互的协议来定义。

客户端/服务器架构风格

胖客户端C/S1. 客户机(前台)完成与用户的交互。2. 服务器(后台)负责数据管理。
瘦客户端C/S1. 表示层:客户机负责与应用逻辑间的对话功能,是应用的用户接口。
2. 功能层:应用服务器是应用的主体,负责具体的业务处理逻辑。3. 数据层:数据库管理系统。

 3. 独立构件架构风格** **

进程通信架构风格

构件通常是命名过程,独立的进程间消息传递的方式可以是点对点、同步异步、远程过程调用。

构件:独立的进程。连接件:消息传递。

基于事件的隐式调用风格

独立构件不直接调用一个过程,而是触发/广播一个或多个事件,通过事件驱动的方式实现通信和协作。构件中的过程在一个/多个事件中注册,当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。

解耦构件之间的依赖关系,降低耦合度,提升灵活性。

支持构件的动态添加和移除,当系统需要新增功能时,可以通过添加监听器或订阅者的方式来扩展系统的功能。

能够实现异步、非阻塞的事件处理:事件发布者将事件发布到事件总线上,事件订阅者可以异步处理这些事件,从而提高系统的并发性和性能。

构件:一些模块(过程、事件的集合)。连接件:在事件中注册一些过程,当发生这些事件时,过程被调用。

 4. 虚拟机架构风格** **

灵活性」****将业务逻辑中频繁变化的部分(用户级别、折扣规则、机器学习流程)定义为可动态改变的规则,通过灵活的自定义规则, 实现规则的重组。基于这个规则来开发构件,能够跨平台适配,业务逻辑随时改变,规则灵活定义、灵活组合。解释器可以解释执行用户自定义的规则(个性化折扣)。
****可扩展性折扣规则是独立的语法规则可动态改变,由解释器对变化的规则进行解析,修改更容易。加入新的用户级别和折扣规则时,通过定义新的规则实现可扩展性。
「****性能」****解释器是运行期动态绑定执行。需要对用户级别与折扣规则进行实时解释性能较差
特点」****系统核心是虚拟机,可以用多种操作来解释一个句子,灵活应对自定义场景。
**「**适用场景」****适合于特定领域,如模式匹配系统、语言编译器。

解释器架构风格

解析与运行自定义的规则/业务/语言,通常被用来建立一种虚拟机,以弥合程序语义与硬件语义之间的差异,但执行效率低。

基于规则的架构风格

基于规则的系统包括:规则集、规则解释器、规则/数据选择器、工作内存。
规则定义:根据具体需求,设计和定义一系列规则,形成规则集。
数据输入:数据输入至工作内存,并进行预处理。规则匹配:通过规则选择器,将输入数据与规则集中的规则进行匹配。操作执行:当规则匹配成功,由规则解释器根据规则定义的操作执行相应的动作。输出生成:根据执行结果生成输出数据。

 5. 仓库/数据共享架构风格** **

数据仓储风格

中央共享数据源+多个独立处理的构件。

  • 中央数据结构:说明当前状态。
  • 独立构件:在中央数据存储上执行。

数据存储在中央仓库,处理流程独立,独立构件之间无直接交互,通过数据仓库间接交互。

独立构件对中央数据进行操作,支持交互式处理。数据与处理解耦合,可动态添加和删除处理组件。独立构件与数据仓库进行数据适配。数据与处理分离,需要加载数据,性能降低。数据处理组件之间一般无依赖关系,可并发调用,提高性能。

黑版系统

适用于解决复杂的非结构化问题,解空间很大,求解过程不确定,对于解决问题没有确定性算法,求解过程中综合运用多种不同的知识源。1. 知识源:独立计算的不同单元2. 黑板:全局数据库3. 控制:通过黑板状态的变化来控制应用于信号处理、语音识别、问题规划、编译器优化、知识推理、松耦合代理数据共享存取。

超文本系统

适用于互联网领域,网状链接,构件之间任意跳转。连接件:通过决定层间如何交互的协议来定义。

 6. 闭环控制架构风格** **

发出控制命令并接收反馈,通过不断的测量被控对象,循环往复达到平衡,设定参数,不断调整。
适合于嵌入式系统,涉及连续的动作与状态。软件与硬件之间可以表示为一个反馈。汽车巡航定速。连接件:通过决定层间如何交互的协议来定义。

 7. C2架构风格** **

通过连接件绑定在一起,按照一组规则运作的并行构件。系统中的构件和连接件都有一个顶部和一个底部,构件的顶部 — 连接件的底部,构件的底部 — 连接件的顶部,构件和构件之间不允许直接连接。