中南大学软件体系结构实验4 结构型设计模式实验.docx
《中南大学软件体系结构实验4 结构型设计模式实验.docx》由会员分享,可在线阅读,更多相关《中南大学软件体系结构实验4 结构型设计模式实验.docx(39页珍藏版)》请在冰点文库上搜索。
![中南大学软件体系结构实验4 结构型设计模式实验.docx](https://file1.bingdoc.com/fileroot1/2023-7/23/a1917668-1879-4ab7-b41f-edcc2ddb3bc0/a1917668-1879-4ab7-b41f-edcc2ddb3bc01.gif)
中南大学软件体系结构实验4结构型设计模式实验
《软件体系结构》
实验报告
项目名称结构型设计模式实验
专业班级
学号
姓名
实验成绩:
批阅教师:
年月日
实验4结构型设计模式实验
实验学时:
2
每组人数:
1
实验类型:
3(1:
基础性2:
综合性3:
设计性4:
研究性)
实验要求:
1(1:
必修2:
选修3:
其它)
实验类别:
3(1:
基础2:
专业基础3:
专业4:
其它)
一、实验目的
熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的结构型设计模式,包括适配器模式、组合模式和外观模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容
1.现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch的binarySearch(int[],int)方法实现了二分查找算法。
试使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。
绘制类图并编程实现。
(要求实现快速排序和二分查找,使用对象适配器实现)
2.WindowsMediaPlayer和RealPlayer是两种常用的媒体播放器,它们的API结构和调用方法存在区别。
现在你的应用程序需要支持这两种播放器API,而且在将来可能还需要支持新的媒体播放器,请问如何设计该应用程序?
绘制类图并编程模拟实现。
3.使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
4.某教育机构组织结构如下图所示:
在该教育机构的OA系统中可以给各级办公室下发公文,试采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
5.某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全部拷贝到移动存储介质(例如MMC卡或SD卡)中。
在实现过程中需要与多个已有的类进行交互,例如通讯录管理类、短信管理类等,为了降低系统的耦合度,试使用外观模式来设计并编程模拟实现该一键备份功能。
6.某信息系统需要提供一个数据处理和报表显示模块,该模块可以读取不同类型的文件中的数据并将数据转换成XML格式,然后对数据进行统计分析,最后以报表方式来显示数据。
由于该过程需要涉及到多个类,试使用外观模式设计该数据处理和报表显示模块。
考虑到有些文件本身已经是XML格式,无须进行格式转换,为了让系统具有更好的扩展性,在系统设计中可以引入抽象外观类。
三、实验要求
1.结合实例,正确无误地绘制适配器模式、组合模式和外观模式的模式结构图;
2.使用任意一种面向对象编程语言实现适配器模式、组合模式和外观模式实例,代码运行正确无误。
四、实验步骤
1.结合实例,使用PowerDesigner绘制适配器模式实例结构图并用面向对象编程语言实现该模式实例;
2.结合实例,使用PowerDesigner绘制适配器模式实例结构图并用面向对象编程语言实现该模式实例;
3.结合实例,使用PowerDesigner绘制组合模式实例结构图并用面向对象编程语言实现该模式实例;
4.结合实例,使用PowerDesigner绘制组合模式实例结构图并用面向对象编程语言实现该模式实例;
5.结合实例,使用PowerDesigner绘制外观模式实例结构图并用面向对象编程语言实现该模式实例;
6.结合实例,使用PowerDesigner绘制外观模式实例结构图并用面向对象编程语言实现该模式实例。
五、实验结果
1.类图:
实现代码:
/***********************************************************************
*Module:
BinarySearch.java
*Author:
Administrator
*Purpose:
DefinestheClassBinarySearch
***********************************************************************/
importjava.util.*;
/**@pdOid209bdfa5-acff-485e-a496-d46862104c80*/
publicclassBinarySearch{
/**@paramarray
*@paramvalue
*@pdOidba1a5cd0-df22-4fb8-9ce7-bcce610b3d30*/
publicintbinarySearch(int[]array,intvalue){
//TODO:
implement
intlow=0;
inthigh=array.length-1;
while(lowintmiddle=(low+high)/2;
if(array[middle]==value){
returnmiddle+1;
}
elseif(array[middle]low=middle+1;
}
elseif(array[middle]>value){
high=middle-1;
}
}
if(low==high){
if(array[low]==value)
returnlow+1;
}
return-1;
}
//publicstaticvoidmain(String[]args){
//int[]array={1,2,3,4,5,6,7,8,9,10};
//BinarySearchbina=newBinarySearch();
//intx=bina.binarySearch(array,10);
//System.out.print(x);
//
//}
}
/***********************************************************************
*Module:
Client.java
*Author:
Administrator
*Purpose:
DefinestheClassClient
***********************************************************************/
importjava.util.*;
/**@pdOid909613c0-f653-4d08-8fba-090e54c06bc1*/
publicclassClient{
publicstaticvoidmain(String[]args){
intarray[]={100,9,7,28,47,98,288,40,58,2,16,49,66,9};
intvalue=100;
DataOperationdataOP=(DataOperation)XMLUtil.getBean();
dataOP.sort(array);
for(inti=0;iSystem.out.print(array[i]+"");
}
System.out.println("\n"+dataOP.search(array,value));
}
}
/***********************************************************************
*Module:
DataOperation.java
*Author:
Administrator
*Purpose:
DefinestheInterfaceDataOperation
***********************************************************************/
importjava.util.*;
/**@pdOid8ae548c4-33ee-41f3-a3ca-c2708f730599*/
publicinterfaceDataOperation{
/**@paramarray
*@pdOida443b05c-7086-470c-bf20-60a406a10975*/
voidsort(int[]array);
/**@paramarray
*@paramvalue
*@return
*@pdOid60008c08-0cf8-4889-8de7-4a73ed4e14c0*/
intsearch(int[]array,intvalue);
}
/***********************************************************************
*Module:
DataOperationAdapter.java
*Author:
Administrator
*Purpose:
DefinestheClassDataOperationAdapter
***********************************************************************/
importjava.util.*;
/**@pdOidc9ed4bcc-817f-4ee9-862b-7f1ebaabc048*/
publicclassDataOperationAdapterimplementsDataOperation{
/**@paramarray
*@pdOida2c2f23c-a99d-4a08-91f6-d51277656bc7*/
publicvoidsort(int[]array){
QuickSortquickSort=newQuickSort();
quickSort.quickSort(array);
//TODO:
implement
}
/**@paramarray
*@paramvalue
*@pdOid17dd16dc-4d19-44c0-b66a-02e11fc9d3bd*/
publicintsearch(int[]array,intvalue){
//TODO:
implement
BinarySearchbinarySearch=newBinarySearch();
returnbinarySearch.binarySearch(array,value);
}
}
/***********************************************************************
*Module:
QuickSort.java
*Author:
Administrator
*Purpose:
DefinestheClassQuickSort
***********************************************************************/
importjava.util.*;
/**@pdOidef5ed092-24eb-464a-b1e3-5005f9a3c3f2*/
publicclassQuickSort{
/**@paramarray
*@pdOid69c0b870-15d8-4315-a932-fc8e731428ff*/
publicvoidquickSort(int[]array){
//TODO:
implement
intn=array.length;
diguiSort(array,0,n-1);
}
voiddiguiSort(int[]array,inty,intx){
intvalue=array[y];
inti=y;
intj=x;
while(iwhile(array[i]<=value&&ii++;
}
while(array[j]>=value&&ij--;
}
if(iswap(array,i,j);
i++;
j--;
}
}
if(value>array[i]){
swap(array,y,i);
}
else{
i--;
swap(array,y,i);
}
if(i>y+1){
diguiSort(array,y,i);
}
if(idiguiSort(array,i+1,x);
}
}
voidswap(intarray[],inti,intj){
intvalue=array[i];
array[i]=array[j];
array[j]=value;
}
//publicstaticvoidmain(Stringargs[]){
//int[]array={5,9,8,7,6,10,4,3,2,1,90,79};
//QuickSortquick=newQuickSort();
//quick.quickSort(array);
//for(inti=0;i<12;i++){
//System.out.print(array[i]+"");
//}
//}
}
Config.xml
xmlversion="1.0"?
>
RealAdapter
2.类图:
实现代码:
/***********************************************************************
*Module:
Client.java
*Author:
Administrator
*Purpose:
DefinestheClassClient
***********************************************************************/
importjava.util.*;
/**@pdOid588f59be-7d2f-4416-abde-f6aac80023ad*/
publicclassClient{
publicstaticvoidmain(String[]args){
PlayerAPIplayer=(PlayerAPI)XMLUtil.getBean();
player.run();
}
}
/***********************************************************************
*Module:
PlayerAPI.java
*Author:
Administrator
*Purpose:
DefinestheInterfacePlayerAPI
***********************************************************************/
importjava.util.*;
/**@pdOidaec32bb3-3fea-4675-92b7-1375a72e9159*/
publicinterfacePlayerAPI{
/**@pdOid3047f451-9d27-4334-bfaa-fbe3451a9dfe*/
voidrun();
}
/***********************************************************************
*Module:
RealAdapter.java
*Author:
Administrator
*Purpose:
DefinestheClassRealAdapter
***********************************************************************/
importjava.util.*;
/**@pdOid5bfa426e-7366-48df-9863-271c0e302248*/
publicclassRealAdapterextendsRealAPIimplementsPlayerAPI{
/**@pdOid22e942aa-73f0-46db-83b3-342f8e3378dc*/
publicvoidrun(){
//TODO:
implement
realRun();
}
}
/***********************************************************************
*Module:
RealAPI.java
*Author:
Administrator
*Purpose:
DefinestheClassRealAPI
***********************************************************************/
importjava.util.*;
/**@pdOid760d8fcb-b33f-43cd-9b42-e351c13ee37b*/
publicclassRealAPI{
/**@pdOid4cebed7e-f200-4cb9-8908-3c65526a61bb*/
publicvoidrealRun(){
//TODO:
implement
System.out.println("RealPlayer正在播放");
}
}
/***********************************************************************
*Module:
WMPAdapter.java
*Author:
Administrator
*Purpose:
DefinestheClassWMPAdapter
***********************************************************************/
importjava.util.*;
/**@pdOid0db13cde-c69d-4a50-b890-f7f116b47681*/
publicclassWMPAdapterextendsWmpapiimplementsPlayerAPI{
/**@pdOid81925d86-9b28-4d0e-b47c-cf127ad19469*/
publicvoidrun(){
//TODO:
implement
wmpRun();
}
}
/***********************************************************************
*Module:
Wmpapi.java
*Author:
Administrator
*Purpose:
DefinestheClassWmpapi
***********************************************************************/
importjava.util.*;
/**@pdOid825bb43f-be50-4fd6-ad9f-9427efbd4f15*/
publicclassWmpapi{
/**@pdOidd953f0dc-2fb1-46b5-b23e-6343ac7c11de*/
publicvoidwmpRun(){
//TODO:
implement
System.out.println("WindowsMediaPlayer正在播放");
}
}
importjavax.xml.parsers.*;
importorg.w3c.dom.*;
importorg.xml.sax.SAXException;
importjava.io.*;
publicclassXMLUtil
{
//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
publicstaticObjectgetBean()
{
try
{
//创建DOM文档对象
DocumentBuilderFactorydFactory=DocumentBuilderFactory.newInstance();
DocumentBuilderbuilder=dFactory.newDocumentBuilder();
Documentdoc;
doc=builder.parse(newFile("src/config.xml"));
//获取包含类名的文本节点
NodeListnl=doc.getElementsByTagName("className");
NodeclassNode=nl.item(0).getFirstChild();
StringcName=classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Classc=Class.forName(cName);
Objectobj=c.newInstance();
returnobj;
}