1、设计模式实验四实验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), 已知类 QuickSo
2、rt的quickSort(int)方法实现了快速排序算法,类 BinarySearch的binarySearch(int, int)方法实现了二分查找算法。试使用适配器模式设计一个系统,在不修 改源代码的情况下将类 QuickSort和类BinarySearch的方法适配到 DataOperation接口中。绘制类图并编程实现。(要求实现快速排序和二分查找,使用对象适配器实现)2.Windows Media Player和RealPlayer是两种常用的媒体播放器,它们的 API结构和调用方法存在区别。现在你的应用程序需要支持这两种播放器 API,而且在将来可能还需要支持新的媒体播放器,请问如
3、何设计该应用程序?绘制类图并编程模拟实现。3.使用组合模式设计一个杀毒软件 (AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件 (File)进行杀毒,文件种类包括文本文件 TextFile、图片文件ImageFile、视频文件 VideoFile。绘制类图并编程模拟实现。4.某教育机构组织结构如下图所示:在该教育机构的 OA 系统中可以给各级办公室下发公文, 试采用组合模式设计该机构的 组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。5.某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能 可以将原本存储在
4、手机中的通信录、 短信、 照片、歌曲等资料一次性全部拷贝到移动存储介 质(例如 MMC 卡或 SD 卡)中。在实现过程中需要与多个已有的类进行交互,例如通讯录 管理类、 短信管理类等, 为了降低系统的耦合度, 试使用外观模式来设计并编程模拟实现该 一键备份功能。6.某信息系统需要提供一个数据处理和报表显示模块,该模块可以读取不同类型的文 件中的数据并将数据转换成 XML 格式,然后对数据进行统计分析,最后以报表方式来显示 数据。 由于该过程需要涉及到多个类, 试使用外观模式设计该数据处理和报表显示模块。 虑到有些文件本身已经是 XML 格式,无须进行格式转换,为了让系统具有更好的扩展性, 在系
5、统设计中可以引入抽象外观类。三、实验要求1.结合实例,正确无误地绘制适配器模式、组合模式和外观模式的模式结构图;2.使用任意一种面向对象编程语言实现适配器模式、组合模式和外观模式实例,代码 运行正确无误。四、实验步骤1. 结合实例,使用 PowerDesigner 绘制适配器模式实例结构图并用面向对象编程语言实 现该模式实例;2. 结合实例,使用 PowerDesigner 绘制适配器模式实例结构图并用面向对象编程语言实 现该模式实例;3.结合实例, 使用 PowerDesigner 绘制组合模式实例结构图并用面向对象编程语言实现 该模式实例;4.结合实例, 使用 PowerDesigner
6、绘制组合模式实例结构图并用面向对象编程语言实现 该模式实例;5.结合实例, 使用 PowerDesigner 绘制外观模式实例结构图并用面向对象编程语言实现 该模式实例;6.结合实例, 使用 PowerDesigner 绘制外观模式实例结构图并用面向对象编程语言实现 该模式实例。五、实验结果1.类图:实现代码:DataOperation .javapublic in terface DataOperati on public void sort(i nt n); public int search(i nt m, int n);Adapter.javapublic class Adapter
7、impleme nts DataOperati on private Bin arySearch bs;private QuickSort qs;public Adapter()qs = new Quicksort。;bs = new Bin arySearch();public void sort(i nt n) qs.quickSort (n);public int search(i nt m, int n) retur n bs.b in arySearch(m, n);QuickSort.javapublic class Quicksort public void quickSort(
8、i nt n) int size = n.len gth;quickSortMethod(n, 0, size - 1);public void quickSortMethod(int n, int left, int right) int q;if (left right) q = partition(n, left, right); quickSortMethod(n, left, q - 1); quickSortMethod(n, q + 1, right);public int partition(int n, int left, int right) int shaft = n l
9、eft;int temp = 0;while (left shaft) right-;while (n left shaft)left+;if (nleft = nright) right-; else temp = n left;nleft = n right;n right = temp;n left = shaft;return left;Bin arySearch.javapublic class Bin arySearch public int bin arySearch(i nt m, int n)Quicksort qs = new Quicksort。;int left = 0
10、;qs(m);int right = m.len gth;while(left n)right = middle - 1;elseleft = middle + 1;return -1;XMLUtil.javaimport javax.xml.parsers.*;import org.w3c.dom.*;import org.xml.sax.SAXExceptio n;import java.io.*;public class XMLUtil/该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBea n()try创建DOM文档对象Do
11、cume ntBuilderFactory dFactory = Docume ntBuilderFactory .newln sta nce();Docume ntBuilder builder = dFactory .n ewDocume ntBuilder();Docume nt doc;doc = builder.parse (new File(src/c on fig.xml);获取包含类名的文本节点NodeList nl = doc.getEleme ntsByTagName(className);Node classNode=nl .item(O).getFirstChild()
12、;String cName=classNode.getNodeValue();/通过类名生成实例对象并将其返回Class c=Class.forName(cName);Object obj=c. newln sta nce();return obj; catch(Excepti on e)e.pri ntStackTrace();return nu II;Clie nt.javapublic class Clie nt public static void main(String args)in t m = 5, 4, 8, 7, 9, 2, 3, 1,0, 6;DataOperatio n
13、dataoperati on;dataoperation = (DataOperatio n)XMLUtil.getBea n();dataoperati on. sort(m);for(i nt i=0; i m.len gth; i+)System.out.pri nt(mi + );System.out.pri ntl n(n + dataoperati on. search(m, 6);2.类图:Clienta Playerrzzr 牙+ pJay fString fileName) . voidA AWMPAdapter-的np . Wi ndowsM ed i a P layer+
14、 play (String fileName) . voidWi rtdows Medi aPlayer+ play (String fileName) void实现代码:Player.javapublic in terface Player public abstract void play(String fileName);WMPAdapter.javapublic class WMPAdapter impleme nts Player private Win dowsMediaPlayer wmp;public WMPAdapter()wmp = new Win dowsMediaPla
15、yer();public void play(String fileName)wmp.play(fileName);RPAdapter.javapublic class RPAdapter impleme nts Player private RealPlayer rp;public RPAd apter()rp = new RealPlayer。;public void play(String fileName)rp.play(fileName);Win dowsMediaPlayer.javapublic class Win dowsMediaPlayer public void play
16、(String fileName)System.out.println(fileName + 用 WindowsMediaPlayer 播放);RealPlayer.javapublic class RealPlayer public void play(String fileName)System.out.println(fileName + 用 RealPlayer 播放);XMLUtil.javaimport javax.xml.parsers.*;import org.w3c.dom.*;import org.xml.sax.SAXExceptio n;import java.io.*
17、;public class XMLUtil/该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBea n()try创建DOM文档对象Docume ntBuilderFactory dFactory = Docume ntBuilderFactory .newln sta nce();Docume ntBuilder builder = dFactory .n ewDocume ntBuilder();Docume nt doc;doc = builder.parse (new File(src/c on fig.xml);获取包含类名
18、的文本节点NodeList nl = doc.getEleme ntsByTagName(className);Node classNode=nl .item(O).getFirstChild();String cName=classNode.getNodeValue();/通过类名生成实例对象并将其返回Class c=Class.forName(cName);Object obj=c. newln sta nce();return obj;catch(Excepti on e)e.pri ntStackTrace();return nu II;Clie nt.javapublic class
19、 Clie nt public static void main(String args)Player p;p = (Player)XMLUtil.getBea n();p.play(Rush Hour);3.类图:Afcslmctf-ihatwlracij+ kNVirus “ void实现代码:AbstractFile.javapublic abstract class AbstractFile public abstract void killVirus();Folder.javaimport java.util.ArrayList;public class Folder exte nd
20、s AbstractFile private String fileName;private ArrayList fileList = new ArrayList();public void killVirus() System.out.println(” 对文件夹 ” + fileName + 杀毒);/调用文件夹内成员的杀毒方法for(Object obj:fileList)(AbstractFile)obj).killVirus();public void add(AbstractFile abFile) fileList.add(abFile);public void remove(A
21、bstractFile abFile) fileList.remove(abFile);public Folder(Stri ng fileName) this.fileName = fileName;public AbstractFile getChild(i nt n) return fileList.get (n);ImageFile.javapublic class ImageFile exte nds AbstractFile private String fileName;public void killVirus() System.out.println(” 对图像文件 ” +
22、fileName + 杀毒);public ImageFile(String fileName) this.fileName = fileName;TextFile.javapublic class TextFile exte nds AbstractFile private String fileName;public void killVirus() System.out.println(” 对文本文件 ” + fileName + 杀毒);public TextFile(String fileName) this.fileName = fileName;public class Vide
23、oFile exte nds AbstractFile private String fileName;public void killVirus() System.out.println(” 对视频文件 ” + fileName + 杀毒);public VideoFile(String fileName) this.fileName = fileName;Clie nt.javapublic class Clie nt public static void main(String args)AbstractFile file1, file2, file3;Folder folder1, f
24、older2;file1 = new ImageFile(” 风景);file2 = new TextFile(乔布斯全传);file3 = new VideoFile(尖峰时刻”);folder1 = new Folder(总文件夹);folder2 = new Folder(子文件夹);folder2.add(file1);folder2.add(file2);folder1.add(file3);folder1.add(folder2);folder1.killVirus();4.类图:实现代码:AbstractBra nch.javapublic abstract class Abst
25、ractBra nch public abstract void receiveDoc();public abstract String getName();AdOffice.javapublic class AdOffice exte nds AbstractBra nch private String name;public void receiveDoc() System.out.println(行政办公室收到文件 );public AdOffice(Stri ng name)this. name = n ame;public String getName()return n ame;E
26、dOffice.javapublic class EdOffice exte nds AbstractBra nch private String name;public void receiveDoc() System.out.println(教务办公室收到文件 ); public EdOffice(Stri ng n ame)this. name = n ame;public String getName()return n ame;Bran ch.javaimport java.util.ArrayList;public class Branch exte nds AbstractBra
27、 nch private ArrayList list;private String name;public Bran ch(Stri ng n ame) this. name = n ame;public void receiveDoc() System.out.println(name + 分部收到文件”); public AbstractBra nch getChild( int n) return list.get( n);public void add(AbstractBra nch abBra nch) list.add(abBra nch);public void remove(
28、AbstractBra nch abBra nch) list.remove(abBra nch);public String getName()return n ame;public void sen dDoc(AbstractBra nch abBra nch) System.out.println(name + 分部发送文件到+ abBranch.getName(); abBra nch.receiveDoc();Clie nt.javapublic class Clie nt public static void main(String args)AbstractBra nch ab1, ab2;Branch b1, b2, b3, b4;ab1 = new AdOffice(” 行政办公室);ab2 = new EdOffice(” 教务办公室”);b1 = new Branch(北京);b2 = new Branch(湖南);b3 = new Branch(长沙);b4 = new Branch(湘潭);b1.se ndDoc(b2);b2.se ndDoc(b3);b2.se ndDoc(b4);b4.se ndDoc(abl);b3.se ndDoc(ab2);5.类图:B0ckUpFac0fe
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1