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

news2024/9/22 7:26:12

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

概念

  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.coloradmin.cn/o/733027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学无止境·MySQL(3-2)

单表查询试题 单表题目一1、创建表2、查询出部门编号为30的所有员工3、所有销售员的姓名、编号和部门编号4、找出奖金高于工资的员工5、找出奖金高于工资60%的员工。6、 找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。7、找出部门编号为10中所…

Elasticsearch + Kibana实现词云

需求 实现文件导入es,支持格式TXT、DOC、PPT、XLS、PDF、图片ik分词器远程热更新自定义扩展字典和停用字典Kibana配置词云,并显示对应文档详情和字典频次,且自定义显示字典 技术点 文件导入:es插件ingest-attachment图片文字识…

Nuxt3如何新建项目

第一步 创建项目 1.新建一个文件目录 nuxt-app 2.命令行cd到目录下运行 npx nuxi init nuxt-test 回车运行下 nuxt-test是文件名自己随意 3.再cd nuxt-test到目录下 运行npm install 4.运行完成后 npm run dev 启动项目 显示以下页面 第二步 修改入口代码,编写自己的代码 1.…

从零开始的PICO教程(2)--实时预览应用场景

从零开始的PICO教程(2)–实时预览应用场景 基于串流能力,你可以通过 PDC 工具在头戴上实时预览应用内场景。​ 文章目录 从零开始的PICO教程(2)--实时预览应用场景一、提示信息​二、准备工作​三、操作步骤​四、故…

SpringBoot3【④ 基础特性(外部和内部化配置,整合Junit)】

1. SpringApplication 1.1. 自定义 banner 类路径添加banner.txt或设置spring.banner.location就可以定制 banner推荐网站:Spring Boot banner 在线生成工具,制作下载英文 banner.txt,修改替换 banner.txt 文字实现自定义,个性化…

笔记本没有WIFI列表解决方案

是否有网络图标类似于地球的图案 打开个性化 点击打开或关闭系统图标 查看网络那一项是否是打开 如果没有打开就打开注册表 如果不是上图中的数据,就右键新建输入以上的数据。如果还是不能解决就进行如下操作 打开控制面板,打开网络与Internet,再打…

初出茅庐的小李博客之机智云获取网络实时时间(NTP)

机智云获取网络实时时间 机智云代码中其实这么一个函数gizwitsGetNTP( )可以获取网络时间,今天就在STM32F407上教大家如何通过机智云获取NTP网络时间。 简单介绍一下NTP: 网络时间同步现在有2种同步协议NTP和PTP,NTP与PTP不同在于时间戳的产生位置。N…

Kubernetes对象深入学习之二:细说schema.ObjectKind

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 在前文咱们对对象体系有了大概了解,接下来就要按照前面换分的三个知识区域逐个深入学习,今天从最简单的对象类型开始 runtime.Object…

PWM 输出实验(stm32)

目录 PWM的代码pwm.cpwm.h main.c 说明:以下内容参考正点原子的资料 PWM的代码 pwm.c //TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitSt…

华为云CodeArts Build-云端化的编译构建平台

随着互联网企业业务种类增多,业务跨平台,多语言编程成为常态。 传统应用软件为本地应用,业务复杂,软件规模大,编译构建耗时长,而且移动终端APP业务变化快,交付要求短平快。 因此一个支持多语言…

环型链表oj

文章目录 题目描述解决方法 题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中…

java 阿里云直播配置及推拉流地址获取

一、开通阿里云直播 首先进入阿里云直播产品主页:https://www.aliyun.com/product/live 。 点击下方的“立即开通”。 如果是还未注册的用户请按照页面提示进行完成注册并实名认证。 2、首次进入会提示开通服务,点击“开通服务”,然后选择计…

[C++] 万字 - C++异常处理分析介绍: 异常概念、异常抛出与捕获匹配原则、重新抛出、异常安全、异常体系...

C语言 错误处理方式 在C语言中, 代码发生错误一般会有两种处理方式: 终止程序. 比如 直接使用assert()断言. 或者直接崩溃 返回、设置错误码 C语言某些函数执行失败, 但是结果不足以导致致命问题时, 就会将错误码设置在errno中. 用户可以通过strerr(errno)来获取错误信息. …

Linux的管道符详解

(该图由AI绘制 关注我 学习AI画图) 目录 管道(重点) 1、管道符 2、过滤(筛选)功能 3、特殊功能(了解) 4、统计功能(重点) 5、xargs命令扩展 管道&…

多元分类预测 | Matlab全连接神经网络(DNN)分类预测,多特征输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 全连接神经网络(DNN)分类预测,多特征输入模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。 部分源码

设计数据库时,字段“是否可用”该取什么英文名?研究active/enable/state/progress的区别

一条记录发布后,除了删除状态,还存在可用、不可用状态(并非审核状态),那么这个字段在数据库中该取什么名字呢?先告诉结果:使用active英文单词衍生出的is_active。 表可用 active - 意为活跃或生…

Java经典面试题下包含答案

21.String、StringBuffer和StringBuilder的区别是什么? 线程安全: String中的对象是不可变的,线程安全StringBuffer对方法加了同步锁,所以是线程安全的StringBuilder没有对方法加同步锁,所以是非线程安全的 使用效率…

【STM32单片机】STM32控制SG90舵机的PWM部分参数的设置解答

STM32控制SG90舵机的PWM部分参数的设置解答 一、舵机控制要知道的知识二、PWM的参数要怎么计算1、为什么要分频呢?2、为什么选择TIM_OCMode_PWM1呢? 每天进步一点点 笔记仅供自学,用来回看复习,不一定适合你,如有错误请…

论青春线上书屋的设计与实现(论文+源码)_kaic

目 录 摘 要 III 第一章 绪论 1 1.1本课题研究背景与意义 1 1.2本课题国内外研究现状 1 第二章 开发技术介绍 3 2.1JDK的安装与配置 3 2.2HTML技术 3 2.3MySQL数据库管理系统 4 2.4JDBC的使用 4 第三章 系统分析 5 3.1系统的设计要求 5 3.2系…

交通 | 动态设施选址问题

论文解读 陈迎新,柯斯琪,曲晨辉,张景琪 编者按 本次解读的文章是Transportation Science 2017年的 《在日益增长的市场中,动态设施选址问题的连续逼近方法》(Wang, X., Lim, M. K., & Ouyang, Y. (2017). A conti…