内部实现的可修改性。因为面向对象式风格要求封装内部数据,隐藏内部实现,所以它可以在不影响外界的情况下,变更其内部实现。
易开发、易理解、易复用的结构组织。面向对象式风格将系统组织为一系列平等、自治的单位,每个单位负责自身的“正确性”,不同单位之间仅仅是通过方法调用相连接,这非常契合模块化思想,能够建立一个易开发、易理解、易复用的实现结构。
3、采用管道和过滤器体系结构风格实现KWIC 关键词索引系统
管道-过滤器风格将系统的功能逻辑建立为部件集合。每个部件实例完成一个对数据流的独立功能处理,它接收数据流输入,进行转换和增量后进行数据流输出。连接件是管道机制,它将前一个过滤器的数据流输出传递给后一个过滤器作为数据流输入。连接件也可能会进行数据流的功能处理,进行转换或增量,但连接件进行功能处理的目的为了适配前一个过滤器的输出和后一个过滤器的输入,而不是为了直接承载软件系统的需求。
各个过滤器可以并发执行。每个过滤器都可以在数据输入不完备的情况下就开始进行处理,每次接到一部分数据流输入就处理和产生一部分输出。这样,整个的过滤器网络就形成了一条流水线。 设计词汇表:
Pipe, Filter
构件和连接件类型构件:Filter
连接件:Pipe
KWIC 的管道过滤器体系结构风格示意图如下所示:
Input medium input Shifting sorting output Filter
Pipe System I/O
基本的计算模型:
过滤器读管道输出流,过滤器写管道输入流,过滤器通过对输入流的增量计算来完成
风格的基本不变性:
过滤器是独立的实体,它们之间通过管道传递数据
管道-过滤器风格可以为所有过滤器部件实例建立模块实现,每个过滤器部件实例被实现为一个单独的模块,可以为所有简单的管道连接件建立一个通用的模块实现,为每个复杂的管道连接件建立一个单独的模块实现,相关联过滤器部件的实现模块要导入管道实现模块。
因为管道-过滤器风格需要并发执行,所以管道-过滤器风格需要为所有过滤器部件实例和复杂连接件实例建立进程实现,每个过滤器部件实例和复杂连接件实例被实现为一个进程。
如果操作系统能够提供管道机制,那么进程实现时的简单管道可以利用操作
系统提供的机制来实现。此时,所有的实现进程都需要部署在同一个物理节点。 如果有中间件平台能够提供管道机制,那么进程实现时的简单管道可以利用中间件平台提供的机制来实现。此时,各个实现进程可以被部署在不同的网络节点。
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 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 i=0;i 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 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 public InputStore(ArrayList 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 public Output(ArrayList public void output(String outputAddress){ FileWriter fw = null; try { fw = new FileWriter(outputAddress);