三种典型的数据流风格

§ Batch Sequential (批处理)

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

§ Process Control(过程控制,3.7)

批处理风格:

直观结构

批处理风格-基本定义

§每个处理步骤是一个独立的程序

§每一步必须在前一步结束后才能开始

§数据必须是完整的,以整体的方式传递

§典型应用:

–传统的数据处理

–程序编译/CASE(computer aided software engineering)工具

批处理风格-基本构成

§基本组件:独立的应用程序

§连接件:某种类型的媒质(magnetic tape)

§表达拓扑结构:连接件定义了相应的数据流图

§每一步骤必须在前一步骤完全结束之后方能开始

程序:#include <iostream>

#include<fstream>

using namespace std;

bool writeFile(constchar* strPath,char strConcern[],int length)

{

ofstream outfile;

outfile.open(strPath,ios::app);

if(!outfile)

{

cerr<<"openerror!"<<endl;

return false;

}

outfile.write(strConcern,length);

outfile.close();

return true;

}

bool ReadFile(constchar * strPath,char strConcern[],int length)

{

ifstream infile;

infile.open(strPath,ios::binary);

if(!infile)

{

cerr<<"openerror"<<endl;

return false;

}

while(!infile.eof())

{

infile.read(strConcern,length);

}

return true;

}

bool factory1()

{

char str[20]="helloworld";

charstrpath[20]="E:\\text1.txt";

bool b=writeFile(strpath,str,sizeof(str));

if(!b)

{

return false;

}

return true;

}

bool factory2()

{

char str[20];

char strpath[20]="E:\\text1.txt";

bool b=ReadFile(strpath,str,sizeof(str));

cout<<str<<endl;

cout<<str<<endl;

charstrpath1[20]="E:\\text2.txt";

boolbw=writeFile(strpath1,str,sizeof(str));

bw=writeFile(strpath1,"第二道工序",sizeof(str));

if(!b||!bw)

{

return false;

}

return true;

}

int main()

{

char strpath[40]="E:\\text2.txt";

char str[20];

bool b1=factory1();

bool b2=factory2();

bool b=ReadFile(strpath,str,sizeof(str));

if(b&&b1&&b2)

{

cout<<str<<endl;

}

//cout << "Hello world!"<< endl;

return 0;

管道过滤器风格:

组件:过滤器,处理数据流

–一个过滤器封装了一个处理步骤

–数据源点和数据终止点可以看作是特殊的过滤器过滤器对输入流进行处理、转换,处理后的结果在输出端流出。§每个组件都有输入/输出集合,组件在输入处读取数

据流,经过内部处理,在输出处生成数据流。

连接件:管道,连接一个源和一个目的过滤器

–转发数据流

–数据可能是ASCII字符形成的流连接件位于过滤器之间,起到信息流的导管的作

用,被称为管道。接件就象是数据流传输的管道,将一个过滤器的输出传到另一过滤器的输入。

管道过滤器优点:由于每个组件的行为不受其他组件的影响,整个系统的行为易于理解

§系统中的组件具有良好的隐蔽性和高内聚、低耦合的特点;

–支持软件复用:

•允许设计者将整个系统的输入/输出行为看成是

多个过滤器的行为的简单合成;

•只要提供适合在两个过滤器之间传送的数据,任何两个过滤器都可被连

接起来;

–系统维护和增强系统性能简单:

•新的过滤器可以添加到现有系统中来,

旧的可以被改进的过滤器替换掉;

允许对一些如吞吐量、死锁等属性的分析;

§支持并行执行:

–每个过滤器是作为一个单独的任务完成,因此可与

其它任务并行执行。

管道-过滤器风格的缺点:

§通常导致进程成为批处理的结构

–这是因为虽然过滤器可增量式地处理数据,但它们

是独立的,所以设计者必须将每个过滤器看成一个

完整的从输入到输出的转换;

§不适合处理交互的应用

–当需要增量地显示改变时,这个问题尤为严重;

处理两个独立但又相关的数据流是可能会遇到困难

§在数据传输上没有通用的标准,每个过滤器都增加

了解析和合成数据的工作,这样就导致了系统性能

下降,并增加了编写过滤器的复杂性。

–绝大部分处理时间消耗在格式转换上(需要对数据传

输进行特定的处理时,会导致对于每个过滤器的解析

输入和格式化输出要做更多的工作,带来系统复杂性

的上升)

过滤器与批处理比较:

程序:管道-过滤器软件体系结构

(1)在dos提示符下输入下面的命令:

dir | more

使得当前目录列表在屏幕上逐屏显示。

dir的输出的是整个目录列表,它不出现在屏幕上而是由于符号“|”的规定,成为下一个命令more的输入,more命令则将其输入一屏一屏地显示,成为命令行的输出。

(2)Java I/O流中的管道流类PipedInputStream和PipedOutputStream可以方便地实现管道-过滤器体系结构,这两个类的实例对象要通过connect方法连接。

下面程序的功能是sender发送“Hello,receiver! I`m sender”给receiver,然后receiver接受后显示出来并且在前面加上“the following is from sender”的信息。管道流内部在实现时还有大量的对同步数据的处理,管道输出流和管道输入流执行时不能互相阻塞,所以一般要开启独立线程分别执行,顺便复习了多线程操作。

import java.io.*;

import java.util.*;

public class TestPiped{

public static void main(String [] args){

sender s = new sender();

receiver r = new receiver();

PipedOutputStream out = s.getOut();

PipedInputStream in = r.getIn();

try{

in.connect(out);

s.start();

r.start();

}catch(Exception e){

e.printStackTrace();

}

}

}

class sender extends Thread {

PipedOutputStream out = new PipedOutputStream();

publicPipedOutputStream getOut(){

return out;

}

public void run() {

String str = "Hello,receiver ! I`msender\n";

try {

out.write(str.getBytes());

out.close();

}catch(Exception e) {

e.printStackTrace();

}

}

}

class receiver extends Thread {

PipedInputStream in = new PipedInputStream();

public PipedInputStream getIn() {

return in;

}

public void run(){

byte [] buf = new byte[1024];

try {

int len = in.read(buf);

System.out.println("the following is from sender:\n"+newString(buf,0,len));

in.close();

}catch(Exception e) {

e.printStackTrace();

}

}

}

程序的执行结果:

thefollowing is from sender:

Hello,receiver ! I`m sender

批处理与管道-过滤器相关推荐

  1. 管道/过滤器架构风格的优点和不足

    管道/过滤器风格的软件架构具有许多很好的特点: (1)使得软构件具有良好的隐蔽性和高内聚.低耦合的特点: (2)允许设计者将整个系统的输入/输出行为看成是多个过滤器的行为的简单合成: (3)支持软件重 ...

  2. 系统架构设计 2.1 管道-过滤器风格

    一. 管道-过滤风格 过滤器:功能组件 管道:数据流之间的通路 1.2 特点 管道/过滤器结构将数据流处理分为几个顺序的步骤来实现,一个步骤的输出是另一个步骤的输入,每个步骤由一个过滤器来实现 每个过 ...

  3. 管道-过滤器软件架构

    每个构件都有一组输出和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流.因此,这里的构件称为过滤器,这种风格的连接件就像是数据流传输的管道,将一个过滤顺的输出传到另一个过滤器的输入. 一个典 ...

  4. Logstash:在实施之前测试 Logstash 管道/过滤器

    检测解析的日志是否包含单个或多个警告消息,然后添加一个字段来说明这两种情况.在很多的情形下,我们在测试 Logstash 的过滤器时,并不急于把实际的 input 的数据接入到过滤器中来进行测试.我们 ...

  5. 管道 过滤器风格 java_完成基于管道过滤器风格的KWI实现.doc

    完成基于管道过滤器风格的KWI实现.doc 实验2:软件体系结构风格实现 一.实验目的 初步了解不同的体系结构风格 掌握不同体系结构风格的实现 二.实验学时 4学时. 三.实验方法 根据KWIC的描述 ...

  6. 管道-过滤器体系结构风格

    特点:单向流:数据源源不断地产生:有一部分数据产生或处理后立马发往下一个处理构件:可能有缓冲(防止处理速度不一致造成数据丢失) 应用实例:编译器,UNIX管道,图像处理,信号处理等 优点: 1.良好的 ...

  7. 系分架构 - 软件架构设计

    个人总结,仅供参考,欢迎加好友一起讨论 文章目录 系分&架构 - 软件架构设计 考点摘要 概念 架构的 4 + 1 视图 软件架构风格 经典五大架构风格 调用/返回风格 独立构件风格 虚拟机风 ...

  8. 软件体系结构期末复习

    软件体系结构期末复习 标签(空格分隔): 未分类 回顾课本和TTP课件 内容总概 章节回顾 第1章.软件体系结构概论 0.软件体系结构的发展过程经历了四个阶段: (1)无体系结构阶段.(2)萌芽阶段. ...

  9. 软件体系结构1~5章知识点整理

    欢迎大家进入我们的个人博客网站一起交流讨论.http://codeingshuang.com 目录 绪论 第一章 软件工程和软件设计概述 第二章 软件模型和描述 第三章 软件体系结构建模和UML 第四 ...

最新文章

  1. linux 文本行倒叙,Linux基础(4)之文本处理
  2. 某多多买菜程序员:最长持续工作时间高达30小时!睁眼就工作,闭眼就睡觉!多多买菜离职率超级高!公司不得不降低门槛持续招人!...
  3. Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image
  4. python学习音频-Python学习笔记--音频处理
  5. iOS初级开发笔记:Block回调,实现简单的绑定支付宝逻辑
  6. 只让输入数字、字母、中文的输入框
  7. [html] HTML5的触屏事件有哪些?
  8. 程序员何苦为难程序员!
  9. 逆水寒斩鸿蒙称号,逆水寒胆大包天称号怎么获得 逆水寒胆大包天称号获得方法一览...
  10. 使用TensorFlow.js的AI聊天机器人二:训练Trivia Expert AI
  11. oracle10g 64位安装包下载地址,Oracle10g下载地址--多平台下的32位和64位
  12. mq系列传感器的程序_Cooper Instruments传感器定制解决方案
  13. SpringBoot控制层页面指定返回html前端页面
  14. eclipse上安装并配置tomcat
  15. Java使用蔡勒公式快速计算某一天是星期几
  16. java pdf 水印_java pdf加水印的方法
  17. 证件照素材大合集(全网最全版本),满足证件照的一切需求!
  18. MySQL中跨库查询怎么搞?
  19. 几行烂代码,用错 Transactional,我赔了16万
  20. java简易扑克牌游戏设计报告_Java第三季 简易扑克牌游戏 练习完成(已自测通过)...

热门文章

  1. JSON与JSONP
  2. 计算机光驱硬盘分区,深入隐藏光驱(磁盘分区)
  3. python将批量音频信号(wav)转化为语谱图并保存(jpg/png)
  4. 工具栏的打印图标不见了_电脑工具栏图标不见了怎么办啊
  5. Max-Product Loopy Belief Propagation for Solving MRF's energy function minimization
  6. Mybatis-Plus如何使用分页
  7. 机器视觉中的光源选型
  8. base64解码是什么
  9. 2021年12月27日多载波NOMA论文阅读
  10. 表示学习的挑战:三场机器学习竞赛报告Challenges in Representation Learning: A report on three machine learning contests