软件体系结构实验指导书
(草稿)
计算机系
备注:本文大部分实验是以Java为开发语言,大家也可以使用C/C++、C#等其他主流开发语言练习。实验的目的是体验软件结构、软件接口的设计,不限定开发语言。
实验一 经典软件体系结构风格(一)
实验目的
(1)理解管道-过滤器软件体系结构、面向对象软件体系结构的原理
(2)掌握管道-过滤器软件体系结构、面向对象软件体系结构的实例
(3)管道-过滤器软件体系结构、面向对象软件体系结构的编程实现
实验内容
1.管道-过滤器软件体系结构
(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();
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));
pipedinputstream in.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
程序的执行结果:
the following is from sender:
Hello,receiver ! I`m sender
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){
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论