软件设计模式与体系结构-软件体系-数据流风格软件体系结构

二、数据流风格软件体系结构

概念

  1. 数据流系统的各软件组件在无数据到达时处于休眠状态,当有数据到达时,该软件组件被激活,开始对数据进行处理。
  2. 数据流风格软件体系结构将整个软件系统看作由一系列作用在连续数据集合上的“变换”组成。数据和作用于其上的操作是互相独立的
  3. 软件系统被分解为一些数据处理单元或称为组件,数据流控制数据处理顺序。

在数据流风格体系结构中的组件是可以被重复使用的,且在保证输入与输出接口都不变的情况下,可以独立修改一个组件,而不影响其他的组件

注意同步问题

代码

数据流风格软件体系结构是一种基于数据流和数据转换的软件设计方法。在数据流风格中,系统由一系列的数据流和数据转换组件构成,数据在组件之间流动,经过转换和处理,最终产生所需的输出结果。

下面是一个简单的代码示例,演示了数据流风格软件体系结构的实现:

# 数据输入组件
def input_component():data = get_input_data()return data# 数据转换组件
def transform_component(data):transformed_data = perform_transformation(data)return transformed_data# 数据处理组件
def process_component(data):result = process_data(data)return result# 数据输出组件
def output_component(result):display_result(result)# 主函数,按照数据流顺序调用组件
def main():# 数据输入data = input_component()# 数据转换transformed_data = transform_component(data)# 数据处理result = process_component(transformed_data)# 数据输出output_component(result)# 调用主函数启动程序
main()

在上述代码示例中,每个组件都有特定的功能和责任:

  • input_component 负责获取输入数据,并将数据传递给下一个组件。
  • transform_component 对输入数据进行转换或处理,生成转换后的数据。
  • process_component 对转换后的数据进行进一步的处理或计算,生成最终的结果。
  • output_component 将结果进行展示或输出。

通过按照数据流的顺序调用这些组件,数据在系统中流动和转换,最终得到期望的输出结果。

数据流风格软件体系结构的优点包括:

  • 可维护性:每个组件都专注于特定的数据处理任务,易于理解和维护。
  • 可扩展性:可以添加新的组件来处理不同的数据流,扩展系统的功能。
  • 可重用性:每个组件可以独立地被其他系统或模块重用。
  • 灵活性:可以根据需要重新组合和连接组件,以满足不同的业务需求。

数据流风格软件体系结构在许多领域中都有应用,特别是在数据处理和转换方面,例如数据流处理系统、ETL(Extract, Transform, Load)工具等。它提供了一种简洁而直观的方式来设计和实现数据驱动的软件系统。

控制流 vs. 数据流

在这里插入图片描述

数据流风格三种例子

Batch Sequential(批处理)
Pipe-and-Filter(管道-过滤器)
Process Control(控制)

Batch Sequential(批处理)

在该系统中,组件为独立的程序,并且这些组件按照先后顺序处理,即只有当一个组件的运行彻底结束以后,下一个组件才能开始执行。可以认为,数据在处理步骤之间的传输是成批(块)的,而不是以数据流的方式进行的。这也是"顺序批处理"名称的由来。

批处理系统特点

  1. 每个处理程序模块都是互为独立的程序
  2. 只有上一程序彻底完成,下一步程序才能开始
  3. 数据作为一个整体进行传输
  4. 因为以上的特点,所以不必对其组件进行同步处理
  5. 因为几个组件只能按照顺序运行,而不能同步运行,所以性能可能比那些能按照几个组件同时运行的程序要差一些
  6. 使用顺序批处理结构设计的软件不适用于要求对数据进行实时处理的系统

批处理系统案例:数字图像处理软件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Pipe-and-Filter(管道-过滤器)

在管道-过滤器软件体系结构中,每个组件都有一组输入和输出,组件读入输入数据流,经过数据处理,然后产生输出数据流。
在输入被完全消费之前,输出便产生了
组件被称为过滤器,这种风格的连接件就像是数据流传输的管道

过滤器

过滤器三个部分组成

  1. Input Port 负责存储待处理的数据
  2. Filter 负责处理数据
  3. Output Port 负责存储已经处理完的数据

在这里插入图片描述

管道

管道的三个组件

  1. Input Stream 输入流
  2. Pipe 管道
  3. Output Stream 输出流

作用:在过滤器之间传送数据

单向流
可能具有缓冲区
管道形成传输图

不同的管道中流动的数据流,具有不同的数据格式
原因:数据在流过每一个过滤器时,被过滤器进行了丰富、精炼、转换、融合、分解等操作,因而发生了变化

管道-过滤器软件体系优点

并发性:对于海量数据处理问题,可以提高高通量的产出
可复用性:封装了过滤器,使得过滤器可以被非常容易地插入与替换

将每个过滤器的输入/输出限制为单一的,则管道-过滤器退化为顺序批处理系统(Batch sequential)

管道过滤器构成的网络,其输出的正确姓与过滤器的递增处理顺序无关

案例分析:主动型过滤器实例

在这里插入图片描述
在这里插入图片描述

类图

在这里插入图片描述

案例分析:设计遗产文件更新系统

在这里插入图片描述
在这里插入图片描述

案例分析:数字图像处理系统

在这里插入图片描述
在这里插入图片描述
不适合于需要共享大量数据的应用设计
不适合处理交互的应用。当需要增量地显示改变时,这个问题尤为严重;

顺序批处理系统与管道-过滤器软件体系结构的比较

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Process Control(控制)

在这里插入图片描述
在这里插入图片描述

作业

在这里插入图片描述
在这里插入图片描述
a、逻辑图:
在这里插入图片描述

b、设计类图:
在这里插入图片描述

c、每个方法的功能:
Filter类:setInPipe()和setOutPipe()负责设置输入输出管道,Start()和Stop()负责控制过滤器开始工作和暂停工作;
Filter类的子类:processData()负责实现每个子类对应的功能;
Pipe类:read()和write()实现数据的读取与写入,close()实现流的关闭。

在这里插入图片描述

a、逻辑图:
在这里插入图片描述

b、设计类图:
在这里插入图片描述

c、每个方法的功能:

Filter类:setInPipe()和setOutPipe()负责设置输入输出管道,Start()和Stop()负责控制过滤器开始工作和暂停工作;
Filter类的子类:processData()负责实现每个子类对应的功能;
Pipe类:read()和write()实现数据的读取与写入,close()实现流的关闭。

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

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

相关文章

第N4周:使用Word2vec实现文本分类

目录 二、数据预处理1.加载数据2.构建词典3.生成数据批次和迭代器 二、模型构建1.搭建模型2.初始化模型3.定义训练与评估函数 三、训练模型1.拆分数据集并运行模型2.测试指定数据 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者&…

测试服务器CPU情况

要查看服务器的CPU情况,你可以使用 TOP 命令结合一些选项来执行相应的测试top 命令:运行 top 命令可以实时监视系统的各个进程和 CPU 使用情况在 top 命令的输出中,有几个重要的指标参数可以帮助你了解系统的 CPU 使用情况和进程信息。以下是…

Mac电脑如何与 Windows 用户共享文件?

在 Mac 上设置文件共享 选取苹果菜单 >“系统偏好设置”,然后点按“共享”。 选择“文件共享”复选框,然后点按“选项”。 选择“使用 SMB 来共享文件和文件夹”复选框。 在“Windows 文件共享”列表中,选择要与 Windows 用户共享文件的…

JavaWeb_瑞吉外卖_项目优化Day11-Mysql主从复制, Nginx

JavaWeb_瑞吉外卖_项目优化Day11-Mysql主从复制, Nginx Mysql主从复制介绍配置主库Master从库Slave 读写分离案例背景Sharding-JDBC介绍入门案例 Nginx概述介绍下载安装目录结构 命令配置文件结构具体应用部署静态资源反向代理负载均衡 来源 Mysql主从复制 介绍 MySQL主从复制…

数据结构--由遍历序列构造二叉树

数据结构–由遍历序列构造二叉树 不同二叉树的中序遍历序列 中序遍历:中序遍历 左 \color{red}左 左子树、 根 \color{purple}根 根结点、中序遍历 右 \color{green}右 右子树 中序遍历序列:BDCAE 结论 : 一个中序遍历序列可能对应多种二叉树形态 \color{green}结论:一个中序…

[NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)

目录 一、理清pop链并进行标注 二、如何编写相关脚本 三、过滤与绕过 1、waf的绕过 2、preg_match的绕过 做这道题作为pop链的构造很典型,也很有意思,因为还存在一些其他东西。 打开链接,这种很多类的PHP代码多半是需要构造pop链 一、理…

stm32_<一文通>_cubemx_freertos

文章目录 前言一、任务调度1.1 延时1.1.1 相对延时1.1.2 绝对延时 1.2 挂起和恢复1.2.1 cmsis的挂起和恢复函数1.2.2 freertos的挂起和恢复函数 1.3 删除1.3.1 cmsis的删除任务函数1.3.2 freertos的删除任务函数 二、Freertos任务与中断三、消息队列3.1 写入和读取一个数据3.2 …

什么是数据一致性

什么是数据一致性 数据一致性这个单词在平常开发中,或者各种文章中都能经常看见,我们常常听见什么东西数据不一致了,造成了一定的损失,赶快修复一下。但是很多同学对一致性具体代表什么意思,他有什么作用依然不是很了解…

一文弄懂Java日志框架

文章目录 日志的概念日志门面JUL日志框架JUL架构入门案例日志的级别Logger之间的父子关系日志的配置文件日志原理解析 LOG4J日志框架Log4j入门Log4j组件LoggersAppendersLayouts Layout的格式Appender的输出自定义Logger JCL日志门面JCL入门JCL原理 SLF4J日志门面SLF4J入门绑定…

Redis优化

目录 一、Redis高可用 二、Redis持久化 1.RDB持久化 1.1触发条件 1.1.1手动触发 1.1.2自动触发 1.2其他自动触发机制 1.3执行流程 1.4启动时加载 2.AOF 持久化 2.1开启AOF 2.2执行流程 2.2.1命令追加(append) 2.2.2文件写入(write)和文件同步(sync) 2.2.3文件重…

TCP Socket性能优化秘籍:掌握read、recv、readv、write、send、sendv的最佳实践

TCP Socket性能优化秘籍:掌握read、recv、readv、write、send、sendv的最佳实践 博主简介一、引言1.1、TCP Socket在网络通信中的重要性1.2、为什么需要优化TCP Socket的性能? 二、TCP Socket读操作的性能优化2.1、read、recv、readv的功能和用法2.2、提…

S32K14x FlexCAN入门

每个系列S32K14x支持的邮箱个数。 基本每个系列的FlexCAN0可以支持32个报文缓存和支持CANFD。 中断源 mail 最多有32个mail • 灵活的消息缓冲区 (MB),总共 32 个消息缓冲区,数据长度为 8 字节 每个,可配置为 Rx 或 Tx 过滤掩码功能 强…