实验一 经典软件体系结构风格
实验课程名软件体系结构理论及应用
专业班级: 软件工程    学  号:    姓    名: 
实验地点: k4-307                                    指导教师: 倪波
一、实验目的
(1)理解管道-过滤器软件体系结构、面向对象软件体系结构的原理
(2)掌握管道-过滤器软件体系结构、面向对象软件体系结构的实例
(3)管道-过滤器软件体系结构、面向对象软件体系结构的编程实现
二、实验的内容和步骤
1.管道-过滤器软件体系结构
Java I/O流中的管道流类PipedInputStreamPipedOutputStream可以方便地实现管道-过滤器体系结构,这两个类的实例对象要通过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();
    public PipedOutputStream getOut(){
        return out;
    }
    public void run() {
          String str = "Hello,receiver ! I`m sender\n";
          try {
                out.Bytes());
                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"+new String(buf,0,len));
            in.close();
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}
程序的执行结果:
2.数据抽象和面向对象软件体系结构
有一个已知的二维坐标系,在坐标系中定义了若干种规则的图形:圆、正方形、矩形和椭圆。使用Java语言进行面向对象的程序设计:(1)首先考虑数据封装性,(2)考虑继承性,(3)考虑抽象类。
abstract class Graph{
protected double x,y;                // x,y是规则图形的中心点坐标
      public Graph(double x,double y){        // 构造函数初始化中心点坐标
          this.x=x;
          this.y=y;
      }
      protected void changeX(double x){        // 修改横坐标
          this.x=x;
        }
      protected void changeY(double y){        // 修改纵坐标
          this.y=y;
      }
      public abstract double area();            // 计算面积的抽象方法
}
class MySquare extends Graph{
      private double length;
      public MySquare(double x,double y,double length){
          super(x,y);
          this.length=length;
        }
      protected void changLength(double length){  // 修改边长length
          this.length=length;
      }
      public double area(){
          return length*length;
      }
}
class MyCircle extends Graph{
      private double radius;
      public MyCircle(double x,double y,double radius){
        super(x,y);
        this.radius=radius;
      }
      protected void changRadius(double radius){  // 修改半径radius
        this.radius=radius;
      }
      public double area(){
          return 3.1416*radius*radius;
      }
}
class MyRectangle extends Graph{
      private double a,b;
      public MyRectangle(double x,double y,double a,double b){
          super(x,y);
          this.a=a;
          this.b=b;
      }
        protected void changLength(double length){  // 修改长length
          a=length;
      }
      protected void changWidth(double width){  // 修改宽width
          b=width;
      }
      public double area(){
          return a*b;
      }
}
class MyEllipse extends Graph{
      private double a,b;
      public MyEllipse (double x,double y,double a,double b){
          super(x,y);
          this.a=a;
            this.b=b;
      }
        protected void changA(double a){  // 修改长轴a
          this.a=a;
      }
      protected void changB(double b){  // 修改短轴b
          this.b=b;
      }
      public double area(){
          return 3.1416*a*b;
      }
}
public class Area{
      public static void main (String arg[]){
MyCircle c=new MyCircle(1,1,3);
          MySquare s=new MySquare(2,2,4);
          MyRectangle r=new MyRectangle(12,9,1,2);
          MyEllipse e=new MyEllipse(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());
    }
}
pipedinputstream该程序的运行结果为: 
思考与提高
1、管道-过滤器软件体系结构与批处理软件体系结构的区别和联系是什么?
答:管道/过滤器结构通常导致进程成为批处理的结构,因为虽然过滤器可增量式地处理数据,但它们是独立的,所以设计者必须将每一个过滤器看成一个完整的从输入到输出的转换。.
限定过滤器的数据存储容量,就可以得到有界管道/过滤器。过滤器将所有输入数据作为单个实体进行处理,这就是批处理系统。
2、面向对象软件体系结构与主程序-子程序软件体系结构的区别和联系是什么?
    答:主程序-子程序体系结构在设计上使用层次化的划分方法,通常采用自顶向下的功能化
设计方法。
        面向对象体系结构在设计上使用面向对象的设计方法,可以隐藏对象的内部状态并且要
求所有对象之间的交互都通过该方法,即进行了数据封装,这也是面向对象编程的基本原则。
三、结论(写本次实验的收获)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。