1、软件设计与体系结构实验指导书 目录1软件体系结构实验指导书(草稿)计算机系备注:本文大部分实验是以 Java 为开发语言,大家也可以使用 C/C+、C#等其他主流开发语言练习。实验的目的是体验软件结构、软件接口的设计,不限定开发语言。软件设计与体系结构实验指导书 目录2软件体系结构实验指导书 .1实验一 经典软件体系结构风格(一) .1实验目的 .1实验内容 .11管道-过滤器软件体系结构 .12数据抽象和面向对象软件体系结构(体验继承结构) .2思考与提高 .4实验二 经典软件体系结构风格(二) .5实验目的 .5实现内容 .51基于事件的隐式调用风格 .52层次软件体系结构 .6实验三 分
2、布式软件体系结构风格 .13实验目的 .13实验内容 .13C/S 体系结构风格 .13思考与提高 .14实验四 MVC 风格 .15实验目的 .15实验内容 .15MVC 的应用和编程实现 .15实验五 软件结构设计的目标 .23实验目的 .23实验内容 .231用 Java 语言实现一个计算器程序 .232健壮性 .233可维护性 基于面向对象技术的计算器程序 .244基于简单工厂模式的计算器程序 .255基于工厂方法模式的计算器程序 .27实验六 软件设计 面向对象方法 .29实验目的 .29实验内容 .291问题域部分的设计 对多重继承的调整 .292数据管理部分的设计 .30实验七
3、设计原则 .35实验目的 .35软件设计与体系结构实验指导书 目录3实验内容 .351里氏代换原则 .352合成/聚合复用原则 .353依赖倒转原则 .364迪米特法则 .375接口隔离原则 .37实验八 设计模式 .38实验目的 .38实验内容 .381单例模式 .382观察者模式 .38实验九 C2 模式 .40实验目的 .40实验内容 .401连接件 ActiveMQ .402构件 C2 Component .403加法构件 Add.49实验十 黑盒模型 .51实验目的 .51实验内容 .511黑盒构件 WorldMatrix .512控制器构件 .513知识源构件 .52要求: .54
4、实验十一 SOA 模式 .55实验目的 .55实验内容 .55软件设计与体系结构实验指导书 实验一 经典软件结构风格1实验一 经典软件体系结构风格(一)实验目的(1)理解管道-过滤器软件体系结构、面向对象软件体系结构的原理(2)掌握管道-过滤器软件体系结构、面向对象软件体系结构的实例(3)管道-过滤器软件体系结构、面向对象软件体系结构的编程实现实验内容1管道-过滤器软件体系结构(1)在 dos 提示符下输入下面的命令:dir | more使得当前目录列表在屏幕上逐屏显示。dir 的输出的是整个目录列表,它不出现在屏幕上而是由于符号“|”的规定,成为下一个命令 more 的输入,more 命令则
5、将其输入一屏一屏地显示,成为命令行的输出。(2)Java I/O 流中的管道流类 PipedInputStream 和 PipedOutputStream 可以方便地实现管道- 过滤器体系结构,这两个类的实例对象要通过 connect 方法连接。下面程序的功能是 sender 发送 “Hello,receiver! Im sender”给 receiver,然后 receiver接受后显示出来并且在前面加上“the following is from sender”的信息。管道流内部在实现时还有大量的对同步数据的处理,管道输出流和管道输入流执行时不能互相阻塞,所以一般要开启独立线程分别执行,顺
6、便复习了多线程操作。import java.io.*;import java.util.*;public class TestPipedpublic static void main(String args)sender s = new sender();receiver r = new receiver();PipedOutputStream out = s.getOut();PipedInputStream in = r.getIn();tryin.connect(out);s.start();r.start();catch(Exception e)e.printStackTrace();
7、class sender extends Thread PipedOutputStream out = new PipedOutputStream();public PipedOutputStream getOut()return out;public void run() String str = “Hello,receiver ! Im sendern“;try out.write(str.getBytes();out.close(); catch(Exception e) e.printStackTrace();软件设计与体系结构实验指导书 实验一 经典软件结构风格2class rece
8、iver extends Thread PipedInputStream in = new PipedInputStream();public PipedInputStream getIn() return in;public void run()byte buf = new byte1024;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();程
9、序的执行结果:the following is from sender:Hello,receiver ! Im sender2数据抽象和面向对象软件体系结构(体验继承结构)有一个已知的二维坐标系,在坐标系中定义了若干种规则的图形:圆、正方形、矩形和椭圆。使用 Java 语言进行面向对象的程序设计:(1)首先考虑数据封装性, (2)考虑继承性, (3)考虑抽象类。abstract class Graphprotected double x,y; / x,y 是规则图形的中心点坐标public Graph(double x,double y) / 构造函数初始化中心点坐标this.x=x;this
10、.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 Graphprivate double length;public MySquare(double x,double y,double length)super(x,y);this.length=length;protected void chan
11、gLength(double length) / 修改边长 lengththis.length=length;public double area()软件设计与体系结构实验指导书 实验一 经典软件结构风格3return length*length;class MyCircle extends Graphprivate double radius;public MyCircle(double x,double y,double radius)super(x,y);this.radius=radius;protected void changRadius(double radius) / 修改半径
12、 radiusthis.radius=radius;public double area()return 3.1416*radius*radius;class MyRectangle extends Graphprivate 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) / 修改长 lengtha=length;protected void changWidth(dou
13、ble width) / 修改宽 widthb=width;public double area()return a*b; class MyEllipse extends Graphprivate 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) / 修改长轴 athis.a=a;protected void changB(double b) / 修改短轴 bthis.b=b;public do
14、uble area()return 3.1416*a*b;软件设计与体系结构实验指导书 实验一 经典软件结构风格4public class Areapublic 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.pr
15、intln(“正方形 s 的面积是“+s.area();System.out.println(“矩形 r 的面积是“+r.area();System.out.println(“椭圆 e 的面积是“+e.area();该程序的运行结果为: 圆 c 的面积是 28.2744正方形 s 的面积是 16.0矩形 r 的面积是 2.0椭圆 e 的面积是 18.8496思考与提高1、管道-过滤器软件体系结构与批处理软件体系结构的区别和联系是什么?2、面向对象软件体系结构与主程序-子程序软件体系结构的区别和联系是什么?软件设计与体系结构实验指导书 实验二 经典体系结构风格5实验二 经典软件体系结构风格(二)
16、实验目的(1)理解基于事件的隐式调用软件体系结构、层次软件体系结构的原理(2)掌握事件的隐式调用软件体系结构、层次软件体系结构的实例(3)事件的隐式调用软件体系结构、层次软件体系结构的编程实现实现内容1基于事件的隐式调用风格(Java 是显式注册事件,对 C/C+、C#感兴趣的同学,可做相应的程序即可)常用控制组件的事件按钮与动作事件(ActionEvent) ,参见下例。按钮与动作事件运行结果import java.awt.*;import java.awt.event.*; /引入 java.awt.event 包处理事件class BtnLabelAction extends Frame
17、 implements ActionListener/声明窗口类(BtnLabelAction )并实现动作事件接口(ActionListener )Label prompt;Button btn;void CreateWindow() /自定义方法setTitle(“MyButton“);prompt = new Label(“你好“); /创建标签对象btn = new Button(“操作“); /创建按钮对象setLayout(new FlowLayout(); /布局设计,用于安排按钮、标签的位置add(prompt); /将标签放入容器add(btn); /将按钮放入容器btn.a
18、ddActionListener(this); /将监听器(窗体对象本身)注册给按钮对象setSize(300,100);setVisible(true);public void actionPerformed(ActionEvent e)/接口 ActionListener 的事件处理方法if(e.getSource()=btn) /判断动作事件是否是由按钮 btn 引发的if(prompt.getText()=“你好“)prompt.setText(“再见“);elseprompt.setText(“你好“);public class BtnTestpublic static void m
19、ain (String args)BtnLabelAction bla=new BtnLabelAction();bla.CreateWindow();软件设计与体系结构实验指导书 实验二 经典体系结构风格62层次软件体系结构基于层次软件体系结构的软件测试系统。第一层为用户图形界面层import java.awt.*;import java.util.*;import javax.swing.*;import java.awt.event.*;import com.sun.java.swing.plaf.windows.*;public class TestingGUI extends JPa
20、nelprivate JTextArea txtTestInfo, txtTestcase;private JLabel lblTestcases;private JPanel buttonPanel;private JComboBox cmbTestcases;private static final String CASE_BUBBLE= “TC1-Test Bubble Sort“;private static final String CASE_HEAP= “TC2-Test Heap Sort“;private static final String CASE_INSERTION=
21、“TC3-Test Insertion Sort“;private static final String EXECUTE = “Execute“;private static final String EXIT = “Exit“;public TestingGUI()txtTestInfo=new JTextArea(“Test output from source shown heren“, 6, 20);txtTestInfo.setLineWrap(true);txtTestcase = new JTextArea(“Testcase info and test validation
22、shown heren“, 4, 15);txtTestcase.setLineWrap(true);buildUpScrollGUI();private void buildUpScrollGUI()setUpButtonPanel();JScrollPane btnPane = new JScrollPane(buttonPanel);JScrollPane textPane = new JScrollPane(txtTestcase);textPane.setMinimumSize(new Dimension(250, 150);JScrollPane testDataPane = ne
23、w JScrollPane(txtTestInfo);JSplitPane upSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);upSplitPane.setLeftComponent(btnPane);upSplitPane.setRightComponent(testDataPane);JScrollPane downPane = new JScrollPane(textPane);Dimension minimumSize = new Dimension(130, 100);btnPane.setMinimumSize(mi
24、nimumSize);textPane.setMinimumSize(new Dimension(100, 100);upSplitPane.setDividerLocation(270);upSplitPane.setPreferredSize(new Dimension(500, 300);JSplitPane bigSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upSplitPane, downPane);bigSplitPane.setDividerLocation(190);add(bigSplitPane);setSize(new Dimension(500, 400);软件设计与体系结构实验指导书 实验二 经典体系结构风格7setVisible(true);private void setUpButtonPanel()lblTestcases = new JLabel(“Test Cases:“);cmbTestcases = new JCombo