设计模式实验四DOC.docx

上传人:b****7 文档编号:9246654 上传时间:2023-02-03 格式:DOCX 页数:23 大小:271.60KB
下载 相关 举报
设计模式实验四DOC.docx_第1页
第1页 / 共23页
设计模式实验四DOC.docx_第2页
第2页 / 共23页
设计模式实验四DOC.docx_第3页
第3页 / 共23页
设计模式实验四DOC.docx_第4页
第4页 / 共23页
设计模式实验四DOC.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

设计模式实验四DOC.docx

《设计模式实验四DOC.docx》由会员分享,可在线阅读,更多相关《设计模式实验四DOC.docx(23页珍藏版)》请在冰豆网上搜索。

设计模式实验四DOC.docx

设计模式实验四DOC

实验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.类图:

实现代码:

DataOperation.java

publicinterfaceDataOperation{

publicvoidsort(int[]n);

publicintsearch(int[]m,intn);

}

Adapter.java

publicclassAdapterimplementsDataOperation{

privateBinarySearchbs;

privateQuickSortqs;

publicAdapter(){

qs=newQuickSort();

bs=newBinarySearch();

}

publicvoidsort(int[]n){

qs.quickSort(n);

}

publicintsearch(int[]m,intn){

returnbs.binarySearch(m,n);

}

}

QuickSort.java

publicclassQuickSort{

publicvoidquickSort(int[]n){

intsize=n.length;

quickSortMethod(n,0,size-1);

}

publicvoidquickSortMethod(intn[],intleft,intright){

intq;

if(left

q=partition(n,left,right);

quickSortMethod(n,left,q-1);

quickSortMethod(n,q+1,right);

}

}

publicintpartition(intn[],intleft,intright){

intshaft=n[left];

inttemp=0;

while(left

while(n[right]>shaft)

right--;

while(n[left]

left++;

if(n[left]==n[right]){

right--;

}else{

temp=n[left];

n[left]=n[right];

n[right]=temp;

}

}

n[left]=shaft;

returnleft;

}

}

BinarySearch.java

publicclassBinarySearch{

publicintbinarySearch(intm[],intn){

QuickSortqs=newQuickSort();

intleft=0;

qs(m);

intright=m.length;

while(left<=right){

intmiddle=(left+right)/2;

if(m[middle]==n)

returnmiddle;

elseif(m[middle]>n)

right=middle-1;

else

left=middle+1;

}

return-1;

}

}

XMLUtil.java

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;

}

catch(Exceptione){

e.printStackTrace();

returnnull;

}

}

}

Client.java

publicclassClient{

publicstaticvoidmain(Stringargs[]){

int[]m={5,4,8,7,9,2,3,1,0,6};

DataOperationdataoperation;

dataoperation=(DataOperation)XMLUtil.getBean();

dataoperation.sort(m);

for(inti=0;i

System.out.print(m[i]+"");

}

System.out.println("\n"+dataoperation.search(m,6));

}

}

2.类图:

实现代码:

Player.java

publicinterfacePlayer{

publicabstractvoidplay(StringfileName);

}

WMPAdapter.java

publicclassWMPAdapterimplementsPlayer{

privateWindowsMediaPlayerwmp;

publicWMPAdapter(){

wmp=newWindowsMediaPlayer();

}

publicvoidplay(StringfileName){

wmp.play(fileName);

}

}

RPAdapter.java

publicclassRPAdapterimplementsPlayer{

privateRealPlayerrp;

publicRPAdapter(){

rp=newRealPlayer();

}

publicvoidplay(StringfileName){

rp.play(fileName);

}

}

WindowsMediaPlayer.java

publicclassWindowsMediaPlayer{

publicvoidplay(StringfileName){

System.out.println(fileName+"用WindowsMediaPlayer播放");

}

}

RealPlayer.java

publicclassRealPlayer{

publicvoidplay(StringfileName){

System.out.println(fileName+"用RealPlayer播放");

};

}

XMLUtil.java

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;

}

catch(Exceptione){

e.printStackTrace();

returnnull;

}

}

}

Client.java

publicclassClient{

publicstaticvoidmain(String[]args){

Playerp;

p=(Player)XMLUtil.getBean();

p.play("RushHour");

}

}

3.类图:

实现代码:

AbstractFile.java

publicabstractclassAbstractFile{

publicabstractvoidkillVirus();

}

Folder.java

importjava.util.ArrayList;

publicclassFolderextendsAbstractFile{

privateStringfileName;

privateArrayListfileList=newArrayList();

publicvoidkillVirus(){

System.out.println("对文件夹"+fileName+"杀毒");

//调用文件夹内成员的杀毒方法

for(Objectobj:

fileList)

((AbstractFile)obj).killVirus();

}

publicvoidadd(AbstractFileabFile){

fileList.add(abFile);

}

publicvoidremove(AbstractFileabFile){

fileList.remove(abFile);

}

publicFolder(StringfileName){

this.fileName=fileName;

}

publicAbstractFilegetChild(intn){

returnfileList.get(n);

}

}

ImageFile.java

publicclassImageFileextendsAbstractFile{

privateStringfileName;

publicvoidkillVirus(){

System.out.println("对图像文件"+fileName+"杀毒");

}

publicImageFile(StringfileName){

this.fileName=fileName;

}

}

TextFile.java

publicclassTextFileextendsAbstractFile{

privateStringfileName;

publicvoidkillVirus(){

System.out.println("对文本文件"+fileName+"杀毒");

}

publicTextFile(StringfileName){

this.fileName=fileName;

}

}

 

publicclassVideoFileextendsAbstractFile{

privateStringfileName;

publicvoidkillVirus(){

System.out.println("对视频文件"+fileName+"杀毒");

}

publicVideoFile(StringfileName){

this.fileName=fileName;

}

}

Client.java

publicclassClient{

publicstaticvoidmain(String[]args){

AbstractFilefile1,file2,file3;

Folderfolder1,folder2;

file1=newImageFile("风景");

file2=newTextFile("乔布斯全传");

file3=newVideoFile("尖峰时刻");

folder1=newFolder("总文件夹");

folder2=newFolder("子文件夹");

folder2.add(file1);

folder2.add(file2);

folder1.add(file3);

folder1.add(folder2);

folder1.killVirus();

}

}

4.类图:

实现代码:

AbstractBranch.java

publicabstractclassAbstractBranch{

publicabstractvoidreceiveDoc();

publicabstractStringgetName();

}

AdOffice.java

publicclassAdOfficeextendsAbstractBranch{

privateStringname;

publicvoidreceiveDoc(){

System.out.println("行政办公室收到文件");

}

publicAdOffice(Stringname){

this.name=name;

}

publicStringgetName(){

returnname;

}

}

EdOffice.java

publicclassEdOfficeextendsAbstractBranch{

privateStringname;

publicvoidreceiveDoc(){

System.out.println("教务办公室收到文件");

}

publicEdOffice(Stringname){

this.name=name;

}

publicStringgetName(){

returnname;

}

}

Branch.java

importjava.util.ArrayList;

publicclassBranchextendsAbstractBranch{

privateArrayListlist;

privateStringname;

publicBranch(Stringname){

this.name=name;

}

publicvoidreceiveDoc(){

System.out.println(name+"分部收到文件");

}

publicAbstractBranchgetChild(intn){

returnlist.get(n);

}

publicvoidadd(AbstractBranchabBranch){

list.add(abBranch);

}

publicvoidremove(AbstractBranchabBranch){

list.remove(abBranch);

}

publicStringgetName(){

returnname;

}

publicvoidsendDoc(AbstractBranchabBranch){

System.out.println(name+"分部发送文件到"+abBranch.getName());

abBranch.receiveDoc();

}

}

 

Client.java

publicclassClient{

publicstaticvoidmain(String[]args){

AbstractBranchab1,ab2;

Branchb1,b2,b3,b4;

ab1=newAdOffice("行政办公室");

ab2=newEdOffice("教务办公室");

b1=newBranch("北京");

b2=newBranch("湖南");

b3=newBranch("长沙");

b4=newBranch("湘潭");

b1.sendDoc(b2);

b2.sendDoc(b3);

b2.sendDoc(b4);

b4.sendDoc(ab1);

b3.sendDoc(ab2);

}

}

5.类图:

实现代码:

BackUpFacade.j

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1