当前位置:文档之家› 软件体系结构KWIC实验

软件体系结构KWIC实验

软件体系结构KWIC实验
软件体系结构KWIC实验

《软件体系结构》

实验:软件体系结构风格之应用

一、实验目的

通过KWIC 实例分析,理解和掌握软件体系结构风格设计与实现。

二、实验内容

多种软件风格设计与实现之KWIC 实例:

1.采用主/子程序体系结构风格实现KWIC 关键词索引系统

2.采用面向对象体系架构风格实现KWIC 关键词索引系统 3.采用管道过滤

体系架构风格实现KWIC 关键词索引系统

4.采用事件过程调用体系架构风格实现KWIC 关键词索引系统

三、实验要求与实验环境

熟练掌握基于主/子程序体系结构风格的KWIC 关键词索引系统,在此基础上,完成基于面向对象体系架构风格的KWIC 关键词索引系统设计与实现。选做基于管道过滤体系架构风格的KWIC 关键词索引系统;选做基于事件过程调用体系架构

风格的KWIC 关键词索引系统。

实验课前完成实验报告的实验目的、实验环境、实验内容、实验操作过程等

内容;实验课中独立/团队操作完成实验报告的实验操作、实验结果及结论等内容;每人一台PC 机,所需软件Win2003/XP 、UML 工具(EclipseUML/

Rose/Visio/StartUML/)、Eclipse/MyEclipse、JDK6.0 等。

四、实验操作

1、采用主/子程序体系结构风格实现KWIC 关键词索引系统

主程序/子程序风格(Main Program/Subroutine Style)将系统组织成层次结构,包括一个主程序和一系列子程序。主程序是系统的控制器,负责调度各子程

序的执行。各子程序又是一个局部的控制器,调度其子程序的执行。设计词汇表:主程序main(), 子程序shift(), sort() 方法,方法的调用,返回构件和连接件类型:

构件:各类子程序,如shift(),sort()

连接件:方法的调用基本的计算模型:

子程序有shift(), sort()方法,shift() 对单词进行移位,sort()方法对单词进行

排序

风格的基本不变性:

主程序有顺序地调用子程序,单线程控制。

KWIC 的主/子程序体系结构风格示意图如下所示:

主程序/子程序风格的重要设计决策与约束有:

●基于声明-使用(程序调用)关系建立连接件,以层次分解的方式建立系

统部件,共同组成层次结构。

●每一个上层部件可以“使用”下层部件,但下层部件不能“使用”上层部件,即不允许逆方向调用。

●系统应该是单线程执行。主程序部件拥有最初的执行控制权,并在“使用”中将控制权转移给下层子程序。

●子程序只能够通过上层转移来获得控制权,可以在执行中将控制权转交给下层的子子程序,并在自身执行完成之后必须将控制权还交给上层部件。

KWIC 主程序/子程序风格的Java 语言实现见附件。

主程序/子程序风格的主要实现机制是模块实现,它将每个子程序都实现为一个模块,主程序实现为整个系统的起始模块。依照抽象规格的层次关系,实现模块也被组织为相应的层次机构,通过导入/导出关系相连接。

需要强调的是,虽然主程序/子程序风格非常类似于结构化程序的结构,但是主程序/子程序风格是基于部件与连接件建立的高层结构。它的部件不同于程序,而是更加粗粒度的模块。而且,在部件的实现模块内部,可以使用结构化方法,也可以使用面向对象方法,这并不妨碍整个系统的高层结构符合主程序/子程序风格的约定。

主程序/子程序风格的优点有:

流程清晰,易于理解。强控制性。严格的层次分解和严格的控制权转移使得主程序/子程序风格对程序的实际执行过程具备很强的控制能力,这带来了一个特点:如果一个子程序所连接的子子程序是正确的,那么就很容易保证该子程序的“正确性”。所以,主程序/子程序风格比其他常见风格更能控制程序的“正确性”。

2、采用面向对象体系结构风格实现KWIC 关键词索引系统

面向对象式风格,需要强调说明的是它的“对象”是部件,属于高层结构的元素,虽然名称相同,但它并不是面向对象方法中所述的“对象”实体。“面向对象式”风格的命名是因为它借鉴了面向对象方法的思想,而不是因为它使用面向对象方法实现体系结构,这也是在该风格名称中有一个“式”字的原因。

面向对象式风格的主要实现机制是模块实现,它将每个对象部件实例都实现为一个模块。存在连接的对象部件实例之间会存在模块的导入/导出关系。

每个模块内部可以是基于面向对象方法的实现,也可以是基于结构化方法的实现。

设计词汇表:

(1)input, output, shift, sort, main 类

(2)shift, sort, output 对象

(3)对象间的消息传递构件和连接件类型:

(1)构件类型:对象

(2)连接件的类型:为对象间的消息传递

KWIC 的面向对象程序体系结构风格示意图如下所示:

基本的计算模型:

Input 模块从文本文件input.txt 中一行一行读取单

Shift 模块用于将单词移位。 Sort

模块将单词进行排序。

Output 模块将最终结果写到文本文件output.txt 中KWIC 面向对象风格的Java 语言实现见附件。

面向对象式风格的优点有:

内部实现的可修改性。因为面向对象式风格要求封装内部数据,隐藏内部实现,所以它可以在不影响外界的情况下,变更其内部实现。

易开发、易理解、易复用的结构组织。面向对象式风格将系统组织为一系列平等、自治的单位,每个单位负责自身的“正确性”,不同单位之间仅仅是通过方法调用相连接,这非常契合模块化思想,能够建立一个易开发、易理解、易复用的实现结构。

3、采用管道和过滤器体系结构风格实现KWIC 关键词索引系统

管道-过滤器风格将系统的功能逻辑建立为部件集合。每个部件实例完成一个对数据流的独立功能处理,它接收数据流输入,进行转换和增量后进行数据流输出。连接件是管道机制,它将前一个过滤器的数据流输出传递给后一个过滤器作为数据流输入。连接件也可能会进行数据流的功能处理,进行转换或增量,但连接件进行功能处理的目的为了适配前一个过滤器的输出和后一个过滤器的输入,而不是为了直接承载软件系统的需求。

各个过滤器可以并发执行。每个过滤器都可以在数据输入不完备的情况下就开始进行处理,每次接到一部分数据流输入就处理和产生一部分输出。这样,整个的过滤器网络就形成了一条流水线。

设计词汇表:

Pipe, Filter

构件和连接件类型构件:Filter

连接件:Pipe

KWIC 的管道过滤器体系结构风格示意图如下所示:

基本的计算模型:

过滤器读管道输出流,过滤器写管道输入流,过滤器通过对输入流的增量计算来完成

风格的基本不变性:

过滤器是独立的实体,它们之间通过管道传递数据

管道-过滤器风格可以为所有过滤器部件实例建立模块实现,每个过滤器部件实例被实现为一个单独的模块,可以为所有简单的管道连接件建立一个通用的模块实现,为每个复杂的管道连接件建立一个单独的模块实现,相关联过滤器部件的实现模块要导入管道实现模块。

因为管道-过滤器风格需要并发执行,所以管道-过滤器风格需要为所有过滤器部件实例和复杂连接件实例建立进程实现,每个过滤器部件实例和复杂连接件实例被实现为一个进程。

如果操作系统能够提供管道机制,那么进程实现时的简单管道可以利用操作

Filter

Pipe System I/O

input output

Shifting

sorting

Input medium

系统提供的机制来实现。此时,所有的实现进程都需要部署在同一个物理节点。如果有中间件平台能够提供管道机制,那么进程实现时的简单管道可以利用中间件平台提供的机制来实现。此时,各个实现进程可以被部署在不同的网络节点。

KWIC 基于管道过滤器风格的JAVA 语言实现见附件。

实验结果:输入文件:

输出文件:

五、实验总结

通过本次实验认识到软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。软件体系结构设计的一个核心问题是能否使用重复的体系结构模式,即能达到体系结构级的软件重用。也就是说,能否在不同的软件系统中,使用同一体系结构。

主/子程序体系结构风格、面向对象体系架构风格、管道过滤体系架构风格、用事件过程调用体系架构风格是四种常用的软件体系结构风格,对于实现同一种功能的软件可以分别采用以上的这四种风格。在建立体系结构过程中,不断明确设计词汇表、构建和连接件的类型、可容许的结构模式、基本的计算类型、风格的基本不变形、常用例子、优缺点。通过明确这些问题,可以理解一种体系结构的基本特征,从而为实现体系结构重用提供可能。

通过对KWIC 进行建模和实现,让我动手把简单的软件体系结构代码实现,在程序里体现体系结构的基本思想,拓展了数据结构的基本知识,将软件设计思想体现在编码环节,为以后的体系结构设计提供基础。

KWIC 主程序/子程序风格的Java 语言实现:

publicstaticvoid alphabetize(){

String[] tmpArray = new String[shiftedLineIndexes.size()]; shiftedLineIndexes.toArray(tmpArray);

Arrays.sort(tmpArray); sortedLineIndexes=tmpArray;

}

publicstaticvoid Output(String outputAddress){ FileWriter fw = null;

try {

fw = new FileWriter(outputAddress);

} catch (IOException e) {

// TODO Auto-generated catch block e.printStackTrace();

}

BufferedWriter bw=new BufferedWriter(fw);

for(int i=0;i

try {

bw.write(sortedLineIndexes[i]); bw.newLine();

} catch (IOException e) {

// TODO Auto-generated catch block e.printStackTrace();

}

}

try {

bw.close();

} catch (IOException e) {

// TODO Auto-generated catch block e.printStackTrace();

}

}

publicstaticvoid Input(String

iFile){ FileReader fr=null; try

{ fr=new FileReader(iFile);

} catch (FileNotFoundException e) { e.printStackTrace(); }

BufferedReader br=new BufferedReader(fr); textLines=new ArrayList();

try { while(br.ready()){

textLines.add(br.readLine());

}

} catch (IOException e) { e.printStackTrace();

}

}

publicstaticvoid

CircularShift(){ shiftedLineIndexes=new

ArrayList(); for(int

i=0;i

orinLine=textLines.get(i); String

sarray[]=orinLine.split(" "); for(int

j=0;j

newLine=sarray[j]; if(sarray.length>1){

if(j==sarray.length-1){

for(int k=0;k<(sarray.length-1);k++){

newLine=newLine+" "+sarray[k];

}

}

else{

for(int k=j+1;k

newLine=newLine+" "+sarray[k];

}

for(int m=0;m

}

}

shiftedLineIndexes.add(newLine);

} } }

KWIC 面向对象风格的Java 语言实现:

//InputStore.java import

java.io.BufferedReader; import

java.io.FileNotFoundException; import

java.io.FileReader; import

java.io.IOException; import

java.util.ArrayList; public class

InputStore { public ArrayList

ls;

public InputStore(ArrayList ls){ this.ls=ls;

}

public void input(String

inputFile){ FileReader fr=null;

try {

fr=new FileReader(inputFile); } catch (FileNotFoundException e) { // TODO Auto-

generated catch block e.printStackTrace();

}

BufferedReader br=new BufferedReader(fr);

try { while(br.ready()){

ls.add(br.readLine());

}

} catch (IOException e) { // TODO

Auto-generated catch block

e.printStackTrace();

}

}

} //Output.java import

java.io.BufferedWriter; import

java.io.FileWriter; import

java.io.IOException; import

java.util.ArrayList; public

class Output { public

ArrayList ls;

public Output(ArrayList ls){ this.ls=ls;

}

public void output(String outputAddress){

FileWriter fw = null; try {

fw = new FileWriter(outputAddress);

} catch (IOException e) { // TODO Auto-

generated catch block e.printStackTrace();

}

BufferedWriter bw=new BufferedWriter(fw);

for(int i=0;i

try {

bw.write(ls.get(i)); bw.newLine();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

try {

bw.close();

} catch (IOException e) {

// TODO Auto-generated catch block e.printStackTrace();

}

}

}

//Alphabetizer.java import

java.util.ArrayList; import java.util.Arrays;

public class Alphabetizer { public

ArrayList ls; public

Alphabetizer(ArrayList

ls){ this.ls=ls;

}

public void alpha(){

String[] tmpArray = new String[ls.size()];

ls.toArray(tmpArray);

Arrays.sort(tmpArray);

for(int

i=0;i

(i, tmpArray[i]);

}

}

}

//CircularShifter.java import

java.util.ArrayList; public class

CircularShifter { public ArrayList ls;

public CircularShifter(ArrayList

ls){ this.ls=ls;

}

public void shift(){

ArrayList shiftedLineIndexes=new ArrayList(); for(int i=0;i

String orinLine=ls.get(i); String sarray[]=orinLine.split(" "); for(int j=0;j

if(sarray.length>1){ if(j==sarray.length-1){ for(int

k=0;k<(sarray.length-1);k++){

newLine=newLine+" "+sarray[k];

}

}

else{

for(int k=j+1;k

newLine=newLine+" "+sarray[k];

}

for(int m=0;m

"+sarray[m];

}

}

}

shiftedLineIndexes.add(newLine);

}

}

ls=shiftedLineIndexes;

}

}

//Main.java import

java.util.ArrayList; public

class Main {

public static void main(String[] args) {

// TODO Auto-generated method stub

ArrayListls=new ArrayList();

InputStore inputStore=new InputStore(ls);

inputStore.input("input.txt");

CircularShifter cs=new CircularShifter(ls);

cs.shift();

Alphabetizer alp=new Alphabetizer(cs.ls);

alp.alpha();

Output output=new Output(alp.ls); output.output("output.txt"); }

}

KWIC 基于管道过滤器风格的JAVA 语言实现

//Main类 package

kwic_pipe; import

java.io.File; import

java.util.Scanner;

public class Main { public static void

main(String[] args) { File infile = new

File("e:\\mykwic_in.txt");

File outfile = new File("e:\\mykwic_out.txt");

Scanner inputfile; Scanner

outputfile;

try{ inputfile = new

Scanner(infile); outputfile =

new Scanner(outfile); // 定义三个

管道

Pipe pipe1 = new Pipe();

Pipe pipe2 = new Pipe();

Pipe pipe3 = new Pipe();

// 定义四种过滤器

Input input = new Input(infile, pipe1); Shift shift = new Shift(pipe1, pipe2);

Output output = new Output(pipe3, outfile);

// 启动四种过滤器的线程

input.transform()

shift. transform ();

output. transform ();

// 直接输出结果

System.out.println("----- infile -----

"); String str = null; while (inputfile.hasNextLine()){ str = inputfile.nextLine();

System.out.println(str);

}

System.out.println("input end");

Thread.sleep(3000);

System.out.println("----- outfile -----

"); while (outputfile.hasNextLine()){ System

.out.println(str);

}

inputfile.close();

outputfile.close();

} catch

(Exception

e){ e.getMessag

e();

}

}

}

//Filter类package kwic_pipe;

import java.io.IOException;

public abstract class Filter {

//定义输入管道

protected Pipe input; //定义输

出管道 protected Pipe output;

private boolean isStart = false;

Filter(Pipe input, Pipe

output){ this.input = input;

this.output = output;

}

// 防止多次调用,调用之后线程开始执

行public void

start(){ if(!isStart){

isStart = true;

Thread thread = new Thread(); thread.start();

}

}

//线程的 run 方法

public void

run(){ try{

this.transform(); }

catch (IOException

e){ e.getMessag

e();

}

}

//将输入数据转换为所需数据并写入输出管道

//由子类实现抽象方法

protected abstract void transform()throws IOException;

}

Pipe类

package kwic_pipe;

import java.io.IOException;

import java.io.PipedReader;

import java.io.PipedWriter;

import java.io.PrintWriter;

import java.util.Scanner;

public class Pipe {

//输入管道

private Scanner pipereader;

//输出管道

private PrintWriter pipewriter;

public Pipe(){

PipedWriter pw = new PipedWriter();

PipedReader pr = new PipedReader();

try{

pw.connect(pr);

} catch (IOException e){ e.getMessage();

}

pipewriter = new PrintWriter(pw);

pipereader = new Scanner(pr);

}

//读入一行数据到管道

//@return 读入的数据

public String readerLine() throws

IOException{ return pipereader.nextLine();

}

//从管道输出一行数据

public void writerLine(String strline) throws

IOException{ pipewriter.println(strline);

}

//将读管道关闭,调用该方法后,不能再从管道中读数据

//如不能关闭则抛出异

public void closeReader() throws

IOException{ pipereader.close();

}

//先刷新数据,在将写管道关闭,调用该方法后,不能向管道中写数据

//如不能关闭则抛出异常

public void closeWriter() throws

IOException{ pipewriter.flush(); pipewriter.close();

}

} Alphabetizer类

package kwic_pipe;

import java.io.IOException; import

java.util.ArrayList; import

java.util.Collections; public class

Alphabetizer extends Filter{

private ArrayList al = new ArrayList();

Alphabetizer(Pipe input, Pipe

output){ super(input, output);

}

//对读入的数据进行排序

protected void transform() throws IOException {

String templine = null;

//读入数据

while((templine = input.readerLine()) !=

null){ al.add(templine);

}

//按字母表排序

Collections.sort(al);

//对排序后的数据进行输出

for(int i = 0; i < al.size();

i++){ output.writerLine(al.get(i));

}

input.closeReader();

output.closeWriter();

}

} Shift类 package

kwic_pipe;

import java.io.IOException; import

java.util.ArrayList; public class

Shift extends Filter{

//单词的列表

private ArrayList wordlist = new ArrayList(); //重组后的行的列表

private ArrayList linelist = new ArrayList(); Shift(Pipe input, Pipe

output){ super(input, output);

}

@Override

protected void transform() throws IOException {

String templine = "";

//读数据

while((templine = input.readerLine()) != null){

//将数据拆分为不同单词

this.lineSplitWord(templine);

//将单词重组为句子

this.recombination();

//输出重组结果

for(int i = 0; i < linelist.size();

i++){ output.writerLine(linelist.ge

t(i)); }

//清空wordlist、linelist和templine

wordlist.clear();

linelist.clear();

templine = "";

}

input.closeReader();

output.closeWriter();

}

//从一行中提取单词存入单词表中

private void lineSplitWord(String line){

String word = ""; int

i = 0; while(i <

line.length()){ if(line.c

harAt(i) != '

'){ word +=

line.charAt(i);

}

else{ wordlist.ad

d(word);

}

i++;

}

}

private void recombination(){

for(int j = 0; j < wordlist.size(); j++){ String templine = ""; for (int k = wordlist.size() - 1 - j; k < wordlist.size(); k++){ templine += wordlist.get(k) + " "; } for (int m = 0; m < wordlist.size()

- 1 - j; m++){ if(m != wordlist.size() - j -

2){ templine += wordlist.get(m) + " ";

}

else{ templine +=

wordlist.get(m);

}

}

linelist.add(templine);

}

}

}

Input类 package

kwic_pipe;

import java.io.File; import

java.io.IOException; import

java.util.Scanner;

public class Input extends Filter{

//输入文件的文件名

private File infile;

Input(File file, Pipe

output){ super(null,

output); this.infile =

file;

}

@Override //读

取数据

protected void transform() throws IOException {

Scanner sc = new Scanner(infile); String templine = ""; while((templine =

sc.nextLine()) !=

null){ output.writerLine(templine);

}

output.closeWriter();

sc.close();

}

}

Output类 package kwic_pipe;

import java.io.File; import

java.io.IOException; import

java.io.PrintWriter;

public class Output extends

Filter{

//输出文件的文件名

private File file;

Output(Pipe input, File

file){ super(input, null);

this.file = file;

}

//输出数据

protected void transform() throws IOException {

PrintWriter pw = new PrintWriter(file); String templine = "";

while((templine = input.readerLine()) !=

null){ pw.write(templine); pw.write("\n");

}

pw.flush();

pw.close();

input.closeReader();

}

}

【精品实验报告】软件体系结构设计模式实验报告

【精品实验报告】软件体系结构设计模式实验报告软件体系结构 设计模式实验报告 学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期: 一、实验目的 熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。 二、实验内容 使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。 (1) 组合模式 使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。绘制类图并编程模拟实现。 (2) 组合模式 某教育机构组织结构如下图所示: 北京总部 教务办公室湖南分校行政办公室 教务办公室长沙教学点湘潭教学点行政办公室

教务办公室行政办公室教务办公室行政办公室 在该教育机构的OA系统中可以给各级办公室下发公文,现采用 组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。) (3) 外观模式 某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。参考类图如下: reader = new FileReader();EncryptFacadecipher = new CipherMachine();writer = new FileWriter();-reader: FileReader-cipher: CipherMachine-writer: FileWriter +EncryptFacade () +fileEncrypt (String fileNameSrc,: voidString plainStr=reader.read(fileNameSrc); String fileNameDes)String

软件体系结构KWIC实验

《软件体系结构》 实验:软件体系结构风格之应用

一、实验目的 通过 KWIC 实例分析,理解和掌握软件体系结构风格设计与实现。 二、实验容 多种软件风格设计与实现之 KWIC 实例: 1.采用主/子程序体系结构风格实现 KWIC 关键词索引系统 2.采用面向对象体系架构风格实现 KWIC 关键词索引系统 3.采用管道过滤 体系架构风格实现 KWIC 关键词索引系统 4.采用事件过程调用体系架构风格实现 KWIC 关键词索引系统 三、实验要求与实验环境 熟练掌握基于主/子程序体系结构风格的 KWIC 关键词索引系统,在此基础上, 完成基于面向对象体系架构风格的 KWIC 关键词索引系统设计与实现。选做基于 管道过滤体系架构风格的 KWIC 关键词索引系统;选做基于事件过程调用体系架 构风格的 KWIC 关键词索引系统。 实验课前完成实验报告的实验目的、实验环境、实验容、实验操作过程等 容;实验课中独立/团队操作完成实验报告的实验操作、实验结果及结论等容;每 人一台 PC 机,所需软件 Win2003/XP 、 UML 工具( EclipseUML/ Rose/Visio/StartUML/)、Eclipse/MyEclipse、JDK6.0 等。 四、实验操作 1、采用主/子程序体系结构风格实现 KWIC 关键词索引系统 主程序/子程序风格(Main Program/Subroutine Style)将系统组织成层次结 构,包括一个主程序和一系列子程序。主程序是系统的控制器,负责调度各子程

序的执行。各子程序又是一个局部的控制器,调度其子程序的执行。设计词汇表: 主程序 main(), 子程序 shift(), sort() 方法,方法的调用,返回构件和连接件类 型: 构件:各类子程序,如 shift(),sort() 连接件:方法的调用基本的计算模型: 子程序有 shift(), sort()方法,shift() 对单词进行移位,sort()方法对单词进行 排序 风格的基本不变性: 主程序有顺序地调用子程序,单线程控制。 KWIC 的主/子程序体系结构风格示意图如下所示: 主程序/子程序风格的重要设计决策与约束有:

体系结构实验报告

中南大学软件学院 软件体系结构 设计模式实验报告 学生姓名:宋昂 所在学院:软件学院 学生学号: 3901080115 学生班级:软件0801 指导老师:刘伟 完成日期: 2010-12-7

一、实验目的 熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式和适配器模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。 二、实验内容 使用PowerDesigner和任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式和适配器模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。 (1) 简单工厂模式 使用简单工厂模式设计一个可以创建不同几何形状(Shape)的绘图工具类,如可创建圆形(Circle)、方形(Rectangle)和三角形(Triangle) 对象,每个几何图形都要有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnsupportedShapeException,绘制类图并编程实现。 (2) 简单工厂模式 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man 对象,如果传入参数“W”,则返回一个Woman对象,使用任意一种面向对象编程语言实现该场景。现需要增加一个新的Robot类,如果传入参数“R”,则返回一个Robot对象,对代码进行修改并注意女娲的变化。 (3) 工厂方法模式 某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式,现使用工厂方法模式设计该系统。用代码实现日志记录器实例,如果在系统中增加一个中的日志记录方式——控制台日志记录(ConsoleLog),绘制类图并修改代码,注意增加新日志记录方式过程中原有代码的变化。

软件设计模式与软件体系结构实验报告

《软件体系结构》大作业(1) 学院:软件学院 课程名称:软件体系结构 专业班级: 学生姓名:学号: 学生姓名:学号: 指导教师: 完成时间:年月日 评分表 1、叙述各小组成员完成本题目的分工协作情况。 小组中的每个成员都先理解题目要求及涉及的设计模式,并一起完成代码编写。另外,组长负责文档制作。 2、评分表 序号姓名评分是否组长 1 2 作业正文需要包括以下内容: 1、作业题目内容的详细描述。 2、完成本题目所采用的软件设计模式名称及画出相应的类图,或者是所采用的 软件体系结构名称及画出相应的体系结构图。

3、画出完成本题目所设计程序的设计类图;如还有其他图,也一并画出。 4、完成本题目所设计的程序代码。 5、程序运行的典型界面截图

1、作业题目内容的详细描述。 【作业2.1-1】例2.3为使用工厂方法模式设计的汽车保险管理应用程序实例。现在需要 扩展例2.3的设计图,添加一个名为LuxuryCarInsurance的类,并且需要编写此类和其他需要添加的类的代码,详细要求参见光盘的相应作业部分。 【作业2.1-1】在例2.4中,设计并且实现了豪华(Super)和中等(Medium)别墅(House)与公寓(Condo)的查询。要求在该设计的基础上,增加一个新的类SemiDetacher(半独立式楼宇),并且编写代码,实现相应的查询功能,详细要求参见光盘的相应作业部分。 2、完成本题目所采用的软件设计模式名称及画出相应的类图,或者是所采用的软件体系结构名称及画出相应的体系结构图。 【作业2.1-1】采用的是工厂方法模式 【作业2.1-2】采用的是抽象方法模式

软件体系结构风格研究分析

软件体系结构风格研究分析 软件体系结构风格研究,分析了各种风格的特点、优缺点,最后重点介绍了三层C/S软件体系结构。 20世纪60年代中期的软件危机使得人们开始重视软件工程的研究。起初,人们把软件设计的重点放在数据结构和算法的选择上。随着软件系统规模越来越大、越来越复杂,整个系统的结构显得越来越重要。 软件体系结构风格分析 最初的软件体系结构是Mainframe结构——客户、数据和程序都被集中在主机上,通常只有少量的GUI界面,对远程数据库的访问比较困难。随着PC的广泛应用,该结构逐渐被淘汰。在20世纪80年代中期出现了Client/Server分布式计算结构,应用程序的处理在客户机和服务器之间分担。随着大型软件系统的开发,这种结构在系统的部署和扩展性方面暴漏出不足。随着Inter的发展,一个更灵活的体系结构“三层/多层计算”体系结构应运而生。 Garlan和Shaw将通用软件体系结构风格总结为以下几类:

1.数据流风格:批处理序列;管道/过滤器。 2.调用/返回风格:主程序/子程序;面向对象风格;层次结构。 3.独立构件风格:进程通讯;事件系统。 4.虚拟机风格:解释器;基于规则的系统。 5.仓库风格:数据库系统;超文本系统;黑板系统。C2风格是最常用的一种软件体系结构风格。从C2风格的组织规则和结构图中,我们可以得出,C2风格具有以下特点: (1)系统中的构件可实现应用需求,并能将任意复杂度的功能封装在一起;(2)所有构件之间的通讯是通过以连接件为中介的异步消 息交换机制来实现的;(3)构件相对独立,构件之间依赖性较少。系统中不存在某些构件将在同一地址空间内执行,或某些构件共享特定控制线程之类的相关性假设。 2.数据抽象和面向对象风格。目前软件界已普遍转向使用面向对象系统,抽象数据类型概念对软件系统有着重要作用。这种风格的构件是对象,或者说是抽象数据类型的实例。对象是一种被称作管理者的构件,因为它负责保持资源的完整性。对象是通过函数和过程的调用来交互的。图2是数据抽象和面向对象风格的示意图。面向对象的系统有许多的优点: (1)因为对象对其他对象隐藏它的表示,所以可以改变一个对象的表示,而不影响其他的对象。(2)设计者可将一些数据存取操作的

软件设计与体系结构实验报告

福建农林大学计算机与信息学院 实验报告 课程名称:软件设计与体系结构 姓名:陈宇翔 系:软件工程系 专业:软件工程 年级:2007 学号:070481024 指导教师:王李进 职称:讲师 2009年12月16日

实验项目列表

福建农林大学计算机与信息学院实验报告 学院:计算机与信息学院专业:软件工程系年级:2007 姓名:陈宇翔 学号:070481024 课程名称:软件设计与体系结构实验时间:2009-10-28 实验室田实验室312、313计算机号024 指导教师签字:成绩: 实验1:ACME软件体系结构描述语言应用 一、实验目的 1)掌握软件体系结构描述的概念 2)掌握应用ACMESTUDIO工具描述软件体系结构的基本操作 二、实验学时 2学时。 三、实验方法 由老师提供软件体系结构图形样板供学生参考,学生在样板的指导下修改图形,在老师的指导下进行软件体系结构描述。 四、实验环境 计算机及ACMESTUDIO。 五、实验内容 利用ACME语言定义软件体系结构风格,修改ACME代码,并进行风格测试。 六、实验操作步骤 一、导入Zip文档 建立的一个Acme Project,并且命名为AcmeLab2。如下图:

接着导入ZIP文档,导入完ZIP文档后显示的如下图: 二、修改风格 在AcmeLab2项目中,打开families下的TieredFam.acme.如下图: 修改组件外观 1. 在组件类型中,双击DataNodeT; 在其右边的编辑器中,将产生预览;选择Modify 按钮,将打开外观编辑器对话框。 2. 首先改变图形:找到Basic shape section,在Stock image dropdown menu中选 择Repository类型. 3. 在Color/Line Properties section修改填充颜色为深蓝色。 4. 在颜色对话框中选择深蓝色,并单击 [OK]. 5. 修改图形的边框颜色为绿色 7. 单击Label tab,在Font Settings section, 设置字体颜色为白色,单击[OK] 产生的图形如下图:

软件体系结构总结

第一章:1、软件体系结构的定义 国内普遍看法: 体系结构=构件+连接件+约束 2、软件体系结构涉及哪几种结构: 1、模块结构(Module) 系统如何被构造为一组代码或数据单元的决策 2、构件和连接件结构(Component-And-Connector,C&C) 系统如何被设计为一组具有运行时行为(构件)和交互(连接件)的元素 3、分配结构(Allocation) 展示如何将来自于模块结构或C&C结构的单元映射到非软件结构(硬件、开发组和文件系统) 3、视图视点模型 视点(View point) ISO/IEC 42010:2007 (IEEE-Std-1471-2000)中规定:视点是一个有关单个视图的规格说明。 视图是基于某一视点对整个系统的一种表达。一个视图可由一个或多个架构模型组成 架构模型 架构意义上的图及其文字描述(如软件架构结构图) 视图模型 一个视图是关于整个系统某一方面的表达,一个视图模型则是指一组用来构建 4、软件体系结构核心原模型 1、构件是具有某种功能的可复用的软件结构单元,表示了系统中主要的计算元素和数据存储。 2.连接件(Connector):表示构件之间的交互并实现构件 之间的连接

特性:1)方向性2)角色3)激发性4)响应特征 第二章 1、软件功能需求、质量属性需求、约束分别对软件架构产生的影响 功能性需求:系统必须实现的功能,以及系统在运行时接收外部激励时所做出的行为或响应。 质量属性需求:这些需求对功能或整个产品的质量描述。 约束:一种零度自由的设计决策,如使用特定的编程语言。 质量原意是指好的程度,与目标吻合的程度,在软件工程领域,目标自然就是需求。 对任何系统而言,能按照功能需求正确执行应是对其最基本的要求。 正确性是指软件按照需求正确执行任务的能力,这无疑是第一重要的软件质量属性。质量属性的优劣程度反映了设计是否成功以及软件系统的整体质量。 系统或软件架构的相关视图的集合,这样一组从不同视角表达系统的视图组合在一起构成对系统比较完整的表达

中南大学软件体系结构设计模式实验二

中南大学软件体系结构设计模式实验二 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】

实验3 设计模式实验二 实验学时: 4 每组人数: 1 实验类型: 3 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 1 (1:必修 2:选修 3:其它) 实验类别: 3 (1:基础 2:专业基础 3:专业 4:其它) 一、实验目的 熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的行为型设计模式,包括职责链模式、命令模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。 二、实验内容 1. 某企业的SCM(Supply Chain Management,供应链管理)系统中包含一个采购审批子系统。该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。如下图所示: 试使用职责链模式设计并模拟实现该系统。 2. 房间中的开关是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,绘制相应的类图并编程模拟实现。 3. 某软件公司欲开发一个基于Windows平台的公告板系统。系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。现使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程实现。 4. 某实时在线股票软件需要提供如下功能:当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的所有股民。试使用观察者模式设计并实现该系统,要求绘制相应的类图并编程模拟实现。 5. 某公司欲开发一套机房监控系统,如果机房达到某一指定温度,温度传感器(Thermosensor)将自动传递信号给各种响应设备,例如警示灯(CautionLight)将闪烁(flicker())、报警器(Annunciator)将发出警报(alarm())、安全逃生门(SecurityDoor)将自动开启(open())、隔热门(InsulatedDoor)将自动关闭(close())

软件体系结构实验报告

实验指导书 实验一 1、实验项目:软件体系结构设计(一) 某系统C/S风格客户端软件体系结构设计 2、实验目的:熟悉C/S风格的工作机制 3、实验内容:针对某个应用系统,选用C/S风格作为这个系统的软件体系结构 风格。熟悉C/S风格的工作机制,对所考察的系统进行C/S风格客户端软件体系结构设计。(针对不同的特定应用系统具体表述) 实验二 1、实验项目:软件体系结构设计(二) 某系统C/S风格服务器软件体系结构设计 2、实验目的:熟悉C/S风格的工作机制 3、实验内容:针对某个应用系统,选用C/S风格作为这个系统的软件体系结构 风格。熟悉C/S风格的工作机制,对所考察的系统进行C/S风格服务器软件体系结构设计。(针对不同的特定应用系统具体表述) 实验三 1、实验项目:UML建模 某系统UML建模 2、实验目的:深入理解UML建模的思想,熟悉UML建模方法 3、实验内容:作为实际应用前的一种演练,深入理解UML建模的思想,熟悉 UML建模方法,锻炼和培养分析问题、解决问题的能力。针对某个选定的应用系统,对其进行用例建模、对象类建模和状态图建模。 实验四 1、实验项目:某系统详细设计 2、实验目的:细化前期设计的有关结果,做出软件的详细规格说明 3、实验内容:详细设计(也叫过程设计)是软件设计的具体模块设计阶段,是 在作为软件开发前期设计的体系结构设计和总体设计的基础上进行的。目的是要细化前期设计的有关结果,做出软件的详细规格说明。要求具体地设计目标系统给个模块的实现过程。 实验五 1、实验项目:系统集成 2、实验目的:系统集成与总结 3、实验内容:综合考察前八次实验的内容,通盘考虑软件设计的整个过程,深 入理解软件体系结构的构建过程

软件体系结构课后作业及答案

1、就项目管理方面而言,软件重用项目与非重用项目有哪些不同之处。 答:使用软件重用技术可减少重复工作,提高软件生产率, 缩短开发周期。同时,由于软构建大多经过严格的质量认证,因此有助于改善软件质量,大量使用构建,软件的灵活性和标准化程度可得到提高。 2、实际参与/组织一个软件重用项目的开发,然后总结你是如何组织该项目的开发的 答:参加了一个网页管理系统的开发,该项目重复使用已有的软件产品用于开发新的软件系统,以达到提高软件系统的开发质量与效率,降低开发成本的目的。在过程中使用了代码的复用、设计结果的复用、分析结果的复用、测试信息的复用等。 3、为什么要研究软件体系结构? 答:1.软件体系结构是系统开发中不同参与者进行交流和信息传播的媒介。 2.软件体系结构代表了早期的设计决策成果。 3.软件体系结构可以作为一种可变换的模型。 4、根据软件体系结构的定义,你认为软件体系结构的模型应该由哪些部分组成? 答:构件(component)可以是一组代码,如程序的模块;也可以是一个独立的程序(如数据库的SQL服务器); 连接件(connector)是关系的抽象,用以表示构件之间的相互作用。如过程调用、管道、远程过程调用等; 限制(constrain):用于对构件和连接件的语义说明。 5、在软件体系结构的研究和应用中,你认为还有哪些不足之处? 答:(1)缺乏同意的软件体系结构的概念,导致体系结构的研究范畴模糊。 (2)ADL繁多,缺乏同意的ADL的支持。 (3)软件体系结构研究缺乏统一的理论模型支持。 (4)在体系结构描述方便,尽管出现了多种标准规范或建议标准,但仍很难操作。 (5)有关软件体系结构性质的研究尚不充分,不能明确给出一个良体系结构的属性或判定标准,没有给出良体系结构的设计指导原则,因而对于软件开发实践缺乏有力的促进作用。 (6)缺乏有效的支持环境软件体系结构理论研究与环境支持不同步,缺乏有效的体系结构分析、设计、方针和验证工具支持,导致体系结构应用上的困难。 (7)缺乏有效的体系结构复用方案。 (8)体系结构发现方法研究相对欠缺。 1、选择一个规模合适的系统,为其建立“4+1”模型。 逻辑视图(Logical View),设计的对象模型(使用面向对象的设计方法时)。 过程视图(Process View),捕捉设计的并发和同步特征。 物理视图(Physical View),描述了软件到硬件的映射,反映了分布式特性。 开发视图(Development View),描述了在开发环境中软件的静态组织结构。 架构的描述,即所做的各种决定,可以围绕着这四个视图来组织,然后由一些用例(use cases)或场景(scenarios)来说明,从而形成了第五个视图。

软件体系结构实验二

南京邮电大学 《软件体系结构》实验报告 实验题目软件体系结构风格之应用 姓名xxx 学号xxx 院系计算机、软件学院 指导老师周国强 2013年12月18日

一、实验目的和要求 实验目的: 通过KWIC实例分析,理解和掌握软件体系结构风格设计与实现。 实验要求: 熟练掌握基于主/子程序体系结构风格的KWIC关键词索引系统,在此基础上,完成基于面向对象体系架构风格的KWIC关键词索引系统设计与实现。选做基于管道过滤体系架构风格的KWIC关键词索引系统;选做基于事件过程调用体系架构风格的KWIC关键词索引系统。 实验课前完成实验报告的实验目的、实验环境、实验内容、实验操作过程等内容;实验课中独立/团队操作完成实验报告的实验操作、实验结果及结论等内容;每人一台PC机,所需软件Win2003/XP、UML工具(EclipseUML/ Rose/Visio/StartUML/)、Eclipse/MyEclipse、JDK6.0等。实验课后完成实验报告的心得体会内容,并及时提交实验报告。 二、实验课时:2 三、实验内容及操作步骤 多种软件风格设计与实现之KWIC实例: 1.采用主/子程序体系结构风格实现KWIC关键词索引系统 public static void input(String inputFile){ fr=null; try { fr=new (inputFile);

} catch ( e) { // TODO Auto-generated catch block e.printStackTrace(); } BufferedReader br=new BufferedReader(fr); textLines=new ArrayList(); try { while(br.ready()){ textLines.add(br.readLine()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void circularShift(){ shiftedLineIndexes=new ArrayList(); for(int i=0;i1){ if(j==sarray.length-1){ for(int k=0;k<(sarray.length-1);k++){ newLine=newLine+" "+sarray[k]; } } else{ for(int k=j+1;k

中南大学软件体系结构实验报告-实验1

实验1 UML实验 实验学时: 4 每组人数:1 实验类型:3 (1:基础性2:综合性3:设计性4:研究性) 实验要求:1 (1:必修2:选修3:其它) 实验类别:3 (1:基础2:专业基础3:专业4:其它) 一、实验目的 1.学会安装和使用建模工具PowerDesigner,熟练使用PowerDesigner绘制常用的UML 图形,熟悉常用的UML建模符号; 2.构建用例模型来描述软件需求,包括绘制用例图,撰写用例文档并制作用例检查矩阵; 3. 学习使用状态图描述对象的状态及转换; 4.学习使用活动图为业务流程建模; 5. 学习使用顺序图描述对象之间的交互; 6. 学习类图的绘制; 7. 学习从系统需求中识别类,并构建相应的面向对象模型; 8. 学习使用PowerDesigner实现正向工程和逆向工程; 9. 学习使用组件图描述每个功能所在的组件位置以及它们之间的关系; 10. 学习使用部署图描述软件中各个组件驻留的硬件位置以及这些硬件之间的交互关系。 二、实验内容 1. 某酒店订房系统描述如下: (1) 顾客可以选择在线预订,也可以直接去酒店通过前台服务员预订; (2) 前台服务员可以利用系统直接在前台预订房间; (3) 不管采用哪种预订方式,都需要在预订时支付相应订金; (4) 前台预订可以通过现金或信用卡的形式进行订金支付,但是网上预订只能通过信用卡进行支付; (5) 利用信用卡进行支付时需要和信用卡系统进行通信; (6) 客房部经理可以随时查看客房预订情况和每日收款情况。 绘制该酒店订房系统的用例图。 2. 根据以下场景绘制用例图: 某企业为了方便员工用餐,为企业餐厅开发了一个订餐系统(COS:Cafeteria Ordering System),企业员工可通过企业内联网使用该系统。该系统功能描述如下: (1) 企业的任何员工都可以查看菜单和今日特价;

软件体系结构期末复习题

软件体系结构期末 复习题

《软件体系结构》期末复习题 简答题: 1、软件体系结构建模的种类有: 结构模型、框架模型、动态模型、过程模型、功能模型。 2、“4+1”视图模型从5个不同的视角包括: 逻辑视图、进程视图、物理视图、开发视图和场景视图来描述软件体系结构。 3、构件:是具有某种功能的可重用的软件模板单元,表示了系统中主要的计算元素和数据存储。 连接件:表示构件之间的交互。 配置:表示构件和连接件的拓扑逻辑和约束。 端口:表示构件和外部环境的交互点。 角色:定义了该连接交互的参与者。 4、画出“4+1”视图模型图,分析各部分的原理和功能。 5、软件体系结构风格: 是描述某一特定应用领域中系统组织方式的惯用模式。

6、软件体系结构 (Software Architecture) 软件体系结构以组件和组件交互的方式定义系统,说明需求与成品系统之间的对应关系,描述系统级别的可伸缩性、能力、吞吐量、一致性和兼容性等属性。软件体系结构由组件、连接件和属性组成。 7、分层系统的优点有: 1)支持基于抽象程度递增的系统设计,使设计者能够把一个复杂系统按递增的步骤进行分解; 2)支持功能增强,因为每一层至多和相邻的上下层交互,因此功能的改变最多影响相邻的上下层; 3)支持重用。只要提供的服务接口定义不变,同一层的不同实现能够交换使用。这样,就能够定义一组标准的接口,而允许各种不同的实现方法。 8、分层系统的缺点有: 1)并不是每个系统都能够很容易地划分为分层的模式,甚至即使一个系统的逻辑结构是层次化的,出于对系统性能的考虑,系统设计师不得不把一些低级或高级的功能综合起来; 2)很难找到一个合适的、正确的层次抽象方法。 9、 B/S体系结构的优点有什么? 答:1)基于B/S体系结构的软件,系统安装、修改和维护全在服务器端解决。用户在使用系统时,仅仅需要一个浏览器就可运行全部的模块,真正达到了“零客户端”的功能,很容易在运行时自动升级。

软件体系结构实验一

《软件体系结构》实验:用UML描述体系结构

一、实验目的 理解“4+1视图”建模思想,熟悉体系结构生命周期模型,掌握基于UML 的软件体系结构建模方法。 二、实验内容 基于UML和“4+1”视图进行KWIC(关键词索引系统)系统建模,完成KWIC 系统的逻辑视图、过程视图、物理视图、开发视图和场景视图。 三、实验要求与实验环境 实验课前完成实验报告的实验目的、实验环境、实验内容、实验操作过程等内容。 实验课中独立/团队操作完成实验报告的实验操作、实验结果及结论等内容;每人一台PC机,所需软件Win2003/XP/7/8/8.1、UML工具(EclipseUML/ Rose/Visio/StartUML/)、Eclipse/MyEclipse、JDK6.0等。实验课后完成实验报告的心得体会内容,并及时提交实验报告。 四、实验操作 1、基于“4+1”视图,利用UML工具对KWIC(关键词索引系统)系统进行视图建模。 逻辑视图(Logical View),设计的对象模型(使用面向对象的设计方法时)。 过程视图(Process View),捕捉设计的并发和同步特征。 物理视图(Physical View),描述了软件到硬件的映射,反映了分布式特性。 开发视图(Development View),描述了在开发环境中软件的静态组织结构。 架构的描述,即所做的各种决定,可以围绕着这四个视图来组织,然后由一些用例(use cases) 或场景(scenarios) 来说明,从而形成了第五个视图。

“4+1”视图模型 2、建立KWIC的逻辑视图 逻辑视图(Logical View)是为了便于理解系统设计的结构与组织,在“分析设计”工作流程中使用了名为逻辑视图的构架视图。可以用对象模型来代表逻辑视图,用类图来描述逻辑视图。系统只有一个逻辑视图,该视图以图形方式说明关键的用例实现、子系统、包和类,它们包含了在构架方面具有重要意义的行为。逻辑视图在每次迭代过程中都会加以改进。 KWIC的逻辑视图如下: KWIC逻辑视图

软件体系结构风格的研究

软件体系结构风格的研究 [摘要] 本文对几种经典的软件体系结构风格进行了具体的阐述,分析了各种风格的特点、优缺点,最后重点介绍了三层C/S软件体系结构。 [关键词] 软件体系结构软件体系结构风格三层C/S软件体系结构 20世纪60年代中期的软件危机使得人们开始重视软件工程的研究。起初,人们把软件设计的重点放在数据结构和算法的选择上。随着软件系统规模越来越大、越来越复杂,整个系统的结构显得越来越重要。 一、软件体系结构风格分析 最初的软件体系结构是Mainframe结构——客户、数据和程序都被集中在主机上,通常只有少量的GUI界面,对远程数据库的访问比较困难。随着PC的广泛应用,该结构逐渐被淘汰。在20世纪80年代中期出现了Client/Server分布式计算结构,应用程序的处理在客户机和服务器之间分担。随着大型软件系统的开发,这种结构在系统的部署和扩展性方面暴漏出不足。随着Internet的发展,一个更灵活的体系结构“三层/多层计算”体系结构应运而生。 Garlan和Shaw将通用软件体系结构风格总结为以下几类: 下面将介绍几种主要和经典的体系结构风格和它们的优缺点。 C2风格是最常用的一种软件体系结构风格。从C2风格的组织规则和结构图中,我们可以得出,C2风格具有以下特点: 2.数据抽象和面向对象风格。

目前软件界已普遍转向使用面向对象系统,抽象数据类型概念对软件系统有着重要作用。这种风格的构件是对象,或者说是抽象数据类型的实例。对象是一种被称作管理者的构件,因为它负责保持资源的完整性。对象是通过函数和过程的调用来交互的。图2是数据抽象和面向对象风格的示意图。 面向对象的系统有许多的优点: 3.基于事件的隐式调用风格。基于事件的隐式调用风格的思想是构件不直接调用一个过程,而是触发或广播一个或多个事件。系统中的其他构件中的过程在一个或多个事件中注册,当一个事件被触发,系统自动调用在这个事件中注册的所有过程,这样,一个事件的触发就导致了另一模块中的过程的调用。基于事件的隐式调用风格的主要特点是事件的触发者并不知道哪些构件会被这些事件影响。这样不能假定构件的处理顺序,甚至不知道哪些过程会被调用。隐式调用系统的主要优点有:(1)为软件重用提供了强大的支持。当需要将一个构件加入现存系统中时,只需将它注册到系统的事件中。(2)为改进系统带来了方便。当用一个构件代替另一个构件时,不会影响到其他构件的接口。隐式调用系统的主要缺点有:①构件放弃了对系统计算的控制。一个构件触发一个事件时,不能确定其他构件是否会响应它。而且即使它知道事件注册了哪些构件的构成,它也不能保证这些过程被调用的顺序。②数据交换的问题。有时数据可被一个事件传递,但另一些情况下,基于事件的系统必须依靠一个共享的仓库进行交互。在这些情况下,全局性能和资源管理便成了问题。③既然过程的语义必须依赖于被触发事件的上下文约束,关于

软件体系结构试题与解答

模拟试题 (一) 第一题:名词解释(每题5分,共20分) 1.软件体系结构(Software Architecture) 2.软件体系结构风格(Software Architecture Style) 3.软件质量属性 4.质量属性驱动的设计方法(ADD) 第二题:单项选择(每题4分,共20分) 1.下面哪种策略能够用来满足可测试性(Testability)的质量属性? A)心跳(Heartbeat)B)模块的抽象化(Generalize the module) C)记录/重放D)授权用户 2?“系统在提供服务给合法用户的同时抵制未授权使用的能力” 题? A)性能B)可测试性 C)可移植性D)安全性 这是哪种质量属性关心的问 3.下面哪种视图不属于软件体系结构中定义的 “ A)物理视图B)设计视图 C)场景视图D)开发视图 4+1 ”视图? 4.下面的图是什么图? LlUDiU Rikk Prk* Deal CaphJF* Du] ACCOuming A)序列图C)对象图B)组件图D)用例图 5.下面的图形描述了何种体系结构风格?

A) C/S B)有序批处理C)主程序/子程序D)面向对象 第三题简答(每题5分,共20分) 1?请描述管道-过滤器体系结构风格的特点并给出适合使用这种风格的一个应用场景。 2.请简要说明黑板风格的定义。 3.请简要说明体系结构权衡分析方法和该方法的特点。 4.什么是“ 4+1视图”,分别给出每个视图的名称和主要关注点。 软件体系结构分析:效用树(20分) 某公司要开发一个在线交易系统,该系统主要关注性能、可更改性、可用性和安全这五 个质量属性。负责开发的团队分析了各个质量属性,设计了一个参考的体系结构。该团队欲 采用效用树技术对体系结构进行评估,下面是相关的场景: 站点1断电后,能够在3秒内完成流量到站点2的迁移; 信用卡交易需要有99.999%的安全性; 用户的授权数据库需要在99.999%的情况下保证可用; 视频必须实时传输; 能够在4人-周内完成对Web用户界面的改变网络失效和恢复必须在 1.5分钟内完成; 减少对客户数据库访问的时间至200毫秒以内; 请根据以上描述,构建相应的效用树 2.软件体系结构构建(20分) https://www.doczj.com/doc/112186808.html,是一家新兴的旅游服务提供商,能够在线为用户提供在线的实时旅游信息 服务,包括路线信息,景点介绍,公交线路查询等,其系统的基本的功能如下所示: 用户可以在网站上注册帐号和密码,成为该站点的客户; 客户可以使用浏览器访问网上的站点,搜索并返回感兴趣的景点信息;该公司需要集成来自旅游线路 提供商的数据库,提供旅游线路支持;需要集成来自景点的信息提供商的数据库,提供景点信息;需 要集成公交公司的应用系统,提供公交信息查询能力。 请首先给出一个基于Java EE平台的企业级分布式系统体系结构图,并根据描述给出各个需求应该分别在体系

0308软件体系结构实验报告

河南工业大学实验报告 (2015~2016学年-第2学期) 课程名称:软件体系结构课程编号:51610192地点:6313/6316/6308/6320 一、实验目的: 验证C/S风格的工作机制。 二、实验内容: 针对某个应用系统,选用C/S风格作为这个系统的软件体系结构风格。熟悉C/S风格的工作机制,对所考察的系统进行C/S风格客户端软件体系结构设计的验证。(针对不同的特定应用系统具体表述)。 三.编程环境 Windows 7 Visual Studio | Dev-C++ Eclipse 四.实验代码 1.画棋盘 // 画横线 for (int i = 0; i <= ROWS; i++) { g.drawLine(MARGIN, MARGIN+ i * GRID_SPAN, MARGIN+ COLS* GRID_SPAN, MARGIN + i * GRID_SPAN); } for (int i = 0; i <= COLS; i++) {// 画竖线 g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i * GRID_SPAN, MARGIN + ROWS * GRID_SPAN); } 2.将鼠标点击转为网格索引 publicvoid mouseMoved(MouseEvent e) {

int x1 = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN; // 将鼠标点击的坐标位置转成网格索引 int y1 = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN; if (x1 < 0 || x1 >ROWS || y1 < 0 || y1 >COLS || gameOver || findChess(x1, y1)) setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); // 设置成默认状态 else setCursor(new Cursor(Cursor.HAND_CURSOR)); } 3.增加棋子 // ********************** 增加黑色棋子 public Point[] BlackAddChess(int x, int y) { if (!isBlack) { String msg = String.format("黑子已经落子,轮到白子"); JOptionPane.showMessageDialog(this, msg); returnnull; } else return addChess(x, y); } // ********************** 增加白色棋子 public Point[] WhiteAddChess(int x, int y) { if (isBlack) { String msg = String.format("白子已经落子,轮到黑子"); JOptionPane.showMessageDialog(this, msg); returnnull; } else return addChess(x, y); } 4.悔棋 publicvoid goback() { if (chessCount == 0) return; chessList[chessCount - 1] = null; chessCount--; if (chessCount> 0) { xIndex = chessList[chessCount - 1].getX(); yIndex = chessList[chessCount - 1].getY(); } isBlack = !isBlack;

中南大学软件体系结构设计模式实验二全解

《软件体系结构》 实验报告 项目名称设计模式实验2 专业班级 学号_________________ 姓名___________________ 实验成绩: 批阅教师:

实验3设计模式实验二 实验学时: 4 每组人数: 1 实验类型: 3 (1 : 基础性 2: 综合性 3: 设计性 4 :研究性) 实验要求: 1 (1 : 必修 2: 选修 3: 其它) 实验类别: 3 (1 : 基础 2: 专业基础 3: 专业 4:其它) 、实验目的 熟练使用 PowerDesigner 和任意一种面向对象编程语言实现几种常见的行为型设计模 式,包括职责链模式、命令模式、观察者模式和策略模式, 理解每一种设计模式的模式动机, 掌握模式结构,学习如何使用代码实现这些模式。 、实验内容 1. 某企业的SCM (Supply Chain Management ,供应链管 理)系统中包含一个采购审批子 系统。该企业的采购审批是分级进行的, 即根据采购金额的不同由不同层次的主管人员来审 批,主任可以审批 5万元以下(不包括 5万元)的采购单,副董事长可以审批 5万元至10 万元(不包括10万元)的采购单,董事长可以审批 10万元至50万元(不包括50万元)的 采购单,50万元及以上的采购单就需要开董事会讨论决定。如下图所示: 试使用职责链模式设计并模拟实现该系统。 2. 房间中的开关是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对 象包括电灯和电 风扇,绘制相应的类图并编程模拟实现。 3. 某软件公司欲开发一个基于 Windows 平台的公告板系统。系统提供一个主菜单 (Menu ),在主菜单中包含了一些菜单项 (Menultem ),可以通过 Menu 类的addMenultem ()方 法增加菜单项。菜单项的主要方法是 click (),每一个菜单项包含一个抽象命令类,具体命令 类包括 OpenCommand (打开命令),CreateCommand (新建命令),EditCommand (编辑命令)等, 命令类具有一个 execute ()方法,用于调用公告板系统界面类 (BoardScreen )的open ()、 create 。、 采购人员 采购单 金额V 5万元 5万元w 金额V 10万元10万元w 金额V 50万元 金额》50万元 主任 副董事长 董事长 董事会

相关主题
文本预览
相关文档 最新文档