实验一经典软件体系结构风格实验课程名:软件体系结构理论及应用专业班级:软件工程学号:姓名:实验地点:k4-307指导教师:倪波一、实验目的(1)理解管道-过滤器软件体系结构、面向对象软件体系结构的原理(2)掌握管道-过滤器软件体系结构、面向对象软件体系结构的实例(3)管道-过滤器软件体系结构、面向对象软件体系结构的编程实现二、实验的内容和步骤1.管道-过滤器软件体系结构JavaI/O流中的管道流类PipedInputStream和PipedOutputStream可以方便地实现管道-过滤器体系结构,这两个类的实例对象要通过connect方法连接。下面程序的功能是sender发送“Hello,receiver!I`msender”给receiver,然后receiver接受后显示出来并且在前面加上“thefollowingisfromsender”的信息。管道流内部在实现时还有大量的对同步数据的处理,管道输出流和管道输入流执行时不能互相阻塞,所以一般要开启独立线程分别执行,顺便复习了多线程操作。importjava.io.*;importjava.util.*;publicclassTestPiped{publicstaticvoidmain(String[]args){senders=newsender();receiverr=newreceiver();PipedOutputStreamout=s.getOut();PipedInputStreamin=r.getIn();try{in.connect(out);s.start();r.start();}catch(Exceptione){e.printStackTrace();}}}classsenderextendsThread{PipedOutputStreamout=newPipedOutputStream();publicPipedOutputStreamgetOut(){returnout;}publicvoidrun(){Stringstr=Hello,receiver!I`msender\n;try{out.write(str.getBytes());out.close();}catch(Exceptione){e.printStackTrace();}}}classreceiverextendsThread{PipedInputStreamin=newPipedInputStream();publicPipedInputStreamgetIn(){returnin;}publicvoidrun(){byte[]buf=newbyte[1024];try{intlen=in.read(buf);System.out.println(thefollowingisfromsender:\n+newString(buf,0,len));in.close();}catch(Exceptione){e.printStackTrace();}}}程序的执行结果:2.数据抽象和面向对象软件体系结构有一个已知的二维坐标系,在坐标系中定义了若干种规则的图形:圆、正方形、矩形和椭圆。使用Java语言进行面向对象的程序设计:(1)首先考虑数据封装性,(2)考虑继承性,(3)考虑抽象类。abstractclassGraph{protecteddoublex,y;//x,y是规则图形的中心点坐标publicGraph(doublex,doubley){//构造函数初始化中心点坐标this.x=x;this.y=y;}protectedvoidchangeX(doublex){//修改横坐标this.x=x;}protectedvoidchangeY(doubley){//修改纵坐标this.y=y;}publicabstractdoublearea();//计算面积的抽象方法}classMySquareextendsGraph{privatedoublelength;publicMySquare(doublex,doubley,doublelength){super(x,y);this.length=length;}protectedvoidchangLength(doublelength){//修改边长lengththis.length=length;}publicdoublearea(){returnlength*length;}}classMyCircleextendsGraph{privatedoubleradius;publicMyCircle(doublex,doubley,doubleradius){super(x,y);this.radius=radius;}protectedvoidchangRadius(doubleradius){//修改半径radiusthis.radius=radius;}publicdoublearea(){return3.1416*radius*radius;}}classMyRectangleextendsGraph{privatedoublea,b;publicMyRectangle(doublex,doubley,doublea,doubleb){super(x,y);this.a=a;this.b=b;}protectedvoidchangLength(doublelength){//修改长lengtha=length;}protectedvoidchangWidth(doublewidth){//修改宽widthb=width;}publicdoublearea(){returna*b;}}classMyEllipseextendsGraph{privatedoublea,b;publicMyEllipse(doublex,doubley,doublea,doubleb){super(x,y);this.a=a;this.b=b;}protectedvoidchangA(doublea){//修改长轴athis.a=a;}protectedvoidchangB(doubleb){//修改短轴bthis.b=b;}publicdoublearea(){return3.1416*a*b;}}publicclassArea{publicstaticvoidmain(Stringarg[]){MyCirclec=newMyCircle(1,1,3);MySquares=newMySquare(2,2,4);MyRectangler=newMyRectangle(12,9,1,2);MyEllipsee=newMyEllipse(2,-1,3,2);System.out.println(圆c的面积是+c.area());System.out.println(正方形s的面积是+s.area());System.out.println(矩形r的面积是+r.area());System.out.println(椭圆e的面积是+e.area());}}该程序的运行结果为:思考与提高1、管道-过滤器软件体系结构与批处理软件体系结构的区别和联系是什么?答:管道/过滤器结构通常导致进程成为批处理的结构,因为虽然过滤器可增量式地处理数据,但它们是独立的,所以设计者必须将每一个过滤器看成一个完整的从输入到输出的转换。.限定过滤器的数据存储容量,就可以得到有界管道/过滤器。过滤器将所有输入数据作为单个实体进行处理,这就是批处理系统。2、面向对象软件体系结构与主程序-子程序软件体系结构的区别和联系是什么?答:主程序-子程序体系结构在设计上使用层次化的划分方法,通常采用自顶向下的功能化设计方法。面向对象体系结构在设计上使用面向对象的设计方法,可以隐藏对象的内部状态并且要求所有对象之间的交互都通过该方法,即进行了数据封装,这也是面向对象编程的基本原则。三、结论(写本次实验的收获)。