《设计模式》刘伟 实验参考答案.docx
- 文档编号:24450661
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:24
- 大小:515.66KB
《设计模式》刘伟 实验参考答案.docx
《《设计模式》刘伟 实验参考答案.docx》由会员分享,可在线阅读,更多相关《《设计模式》刘伟 实验参考答案.docx(24页珍藏版)》请在冰豆网上搜索。
《设计模式》刘伟实验参考答案
《设计模式》刘伟实验参考答案
实验1
1.在某图形库API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:
在该图形库中,每个图形类(如Circle、Triangle等)的init()方法用于初始化所创建的图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:
1由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;
2在图形库中增加并使用新的图形时需要修改客户类源代码;
3客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:
1隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;
2客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
参考答案:
2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形
(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制draw()和擦除erase()
两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,绘制类图并编程模拟实现。
参考答案:
3.现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。
图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。
试使用工厂方法模式设计该程序,绘制类图并编程模拟实现。
需充分考虑系统的灵活性和可扩展性。
参考答案:
4.某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。
不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:
该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。
试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。
参考答案:
5.使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限个,例如两个或三个,设计并编写代码实现一个多例类。
参考答案:
Multiton
-array:
Multiton[]
-Multiton()
+getInstance():
Multiton
+random():
int
多例模式(MultitonPattern)是单例模式的一种扩展形式,多例类可以有多个实例,而且必须自行创建和管理实例,并向外界提供自己的实例,可以通过静态集合对象来存储这些实
例。
多例类Multiton的代码如下所示:
importjava.util.*;
publicclassMultiton
{
//定义一个数组用于存储四个实例
privatestaticMultiton[]array={newMultiton(),newMultiton(),newMultiton(),newMultiton()};
//私有构造函数
privateMultiton()
{
}
//静态工厂方法,随机返回数组中的一个实例
publicstaticMultitongetInstance()
{
}
returnarray[random()];
}
//随机生成一个整数作为数组下标publicstaticintrandom()
{
Dated=newDate();
Randomrandom=newRandom();intvalue=Math.abs(random.nextInt());value=value%4;returnvalue;
}publicstaticvoidmain(Stringargs[])
{
Multitonm1,m2,m3,m4;m1=Multiton.getInstance();m2=Multiton.getInstance();m3=Multiton.getInstance();m4=Multiton.getInstance();
System.out.println(m1==m2);
System.out.println(m1==m3);
System.out.println(m1==m4);
}
6.使用单例模式设计一个多文档窗口(注:
在JavaAWT/Swing开发中可使用
JDesktopPane和JInternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次,即只能弹出一个相同的子窗体,如下图所示,编程实现该功能。
(注:
用C#或C++实现类似功能也可以)参考答案:
SubFrame类充当单例类,在其中定义了静态工厂方法getFrame()。
代码如下所示:
importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;
//子窗口:
单例类
classSubFrameextendsJInternalFrame
{
privatestaticSubFrameframe;//静态实例
//私有构造函数
privateSubFrame()
{super("子窗体",true,true,true,false);this.setLocation(20,20);//设置内部窗体位置this.setSize(200,200);//设置内部窗体大小
this.addInternalFrameListener(newMyIFListener());//监听窗体事件this.setVisible(true);
}
//工厂方法,返回窗体实例
publicstaticSubFramegetFrame(){
//如果窗体对象为空,则创建窗体,否则直接返回已有窗体
if(frame==null)
{frame=newSubFrame();
}
returnframe;
}
//事件监听器
classMyIFListenerextendsInternalFrameAdapter{
//子窗体关闭时,将窗体对象设为null
publicvoidinternalFrameClosing(InternalFrameEvente)
{
if(frame!
=null)
{
frame=null;
}
}
}
}
//客户端测试类
classMainClassextendsJFrame
{privateJButtonbutton;privateJDesktopPanedesktopPane;privateSubFrameiFrame=null;
publicMainClass()
{
super("主窗体");
Containerc=this.getContentPane();c.setLayout(newBorderLayout());
button=newJButton("点击创建一个内部窗体");button.addActionListener(newBtListener());c.add(button,BorderLayout.SOUTH);
desktopPane=newJDesktopPane();//创建DesktopPanec.add(desktopPane);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setLocationRelativeTo(null);this.setSize(400,400);this.show();
}
//事件监听器
classBtListenerimplementsActionListener
{publicvoidactionPerformed(ActionEvente)
{
if(iFrame!
=null)
{
desktopPane.remove(iFrame);
}
iFrame=SubFrame.getFrame();desktopPane.add(iFrame);
}
}publicstaticvoidmain(String[]args)
{newMainClass();
}
}
SubFrame类是JInternalFrame类的子类,在SubFrame类中定义了一个静态的SubFrame类型的实例变量,在静态工厂方法getFrame()中创建了SubFrame对象并将其返回。
在MainClass类中使用了该单例类,确保子窗口在当前应用程序中只有唯一一个实例,即只能弹出一个子窗口。
实验2
1.现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch的binarySearch(int[],int)方法实现了二分查找算法。
试使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。
绘制类图并编程实现。
(要求实现快速排序和二分查找,使用对象适配器实现)参考答案:
2.WindowsMediaPlayer和RealPlayer是两种常用的媒体播放器,它们的API结构和调用方法存在区别。
现在你的应用程序需要支持这两种播放器API,而且在将来可能还需要支持新的媒体播放器,请问如何设计该应用程序?
绘制类图并编程模拟实现。
参考答案:
可使用适配器模式和抽象工厂模式,参考类图如下所示:
在该类图中,为两种不同的播放器提供了两个具体工厂类MediaPlayerFactory和
RealPlayerFactory,其中MediaPlayerFactory作为WindowsMediaPlayer播放器工厂,可以创建WindowsMediaPlayer的主窗口(MediaPlayerWindow)和播放列表(MediaPlayerList)(为了
简化类图,只列出主窗口和播放列表这两个播放器组成元素,实际情况下包含更多组成元素);RealPlayerFactory作为RealPlayer播放器工厂,创建RealPlayer的主窗口(RealPlayerWindow)和播放列表(RealPlayerList),此时可以使用抽象工厂模式,客户端针对抽象工厂PlayerFactory编程,如果增加新的播放器,只需增加一个新的具体工厂来生产新产品族中的产品即可。
由于需要调用现有API中的方法,因此还需要使用适配器模式,在具体产品类如MediaPlayerWindow和MediaPlayerList调用WindowsMediaPlayerAPI中的方法,在RealPlayerWindow和RealPlayerList中调用RealPlayerAPI中的方法,实现对API中方法的适配,此时具体产品如MediaPlayerWindow、RealPlayerWindow等充当适配器,而已有的API如MediaPlayerAPI和RealPlayerAPI是需要适配的适配者。
3.使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹
(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
参考答案:
4.某教育机构组织结构如下图所示:
在该教育机构的OA系统中可以给各级办公室下发公文,试采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
参考答案:
参考类图如下所示:
本实例使用了安全组合模式,Unit充当抽象构件角色,Office充当叶子构件角色,
Institution充当容器构件角色。
本实例代码如下所示:
abstractclassUnit
{publicabstractvoidhandleArchives();
}
classOfficeextendsUnit
{privateStringname;publicOffice(Stringname)
{
this.name=name;
}
publicvoidhandleArchives()
{
System.out.println(this.name+"处理公文!
");
}
}
classInstitutionextendsUnit
{privateArrayListlist=newArrayList();privateStringname;
publicInstitution(Stringname)
{
this.name=name;
}
publicvoidadd(Unitunit)
{
list.add(unit);
}
}
publicvoidhandleArchives()
{
System.out.println(this.name+"接收并下发公文:
");for(Objectobj:
list)
{
((Unit)obj).handleArchives();
}
}
在客户类中创建树形结构,代码如下所示:
classClient
{publicstaticvoidmain(Stringargs[])
{
InstitutionbjHeadquarters,hnSubSchool,csTeachingPost,xtTeachingPost;UnittOffice1,tOffice2,tOffice3,tOffice4,aOffice1,aOffice2,aOffice3,aOffice4;bjHeadquarters=newInstitution("北京总部");hnSubSchool=newInstitution("湖南分校");csTeachingPost=newInstitution("长沙教学点");xtTeachingPost=newInstitution("湘潭教学点");tOffice1=newOffice("北京教务办公室");tOffice2=newOffice("湖南教务办公室");tOffice3=newOffice("长沙教务办公室");tOffice4=newOffice("湘潭教务办公室");aOffice1=newOffice("北京行政办公室");aOffice2=newOffice("湖南行政办公室");aOffice3=newOffice("长沙行政办公室");aOffice4=newOffice("湘潭行政办公室");csTeachingPost.add(tOffice3);csTeachingPost.add(aOffice3);xtTeachingPost.add(tOffice4);xtTeachingPost.add(aOffice4);hnSubSchool.add(csTeachingPost);hnSubSchool.add(xtTeachingPost);hnSubSchool.add(tOffice2);hnSubSchool.add(aOffice2);bjHeadquarters.add(hnSubSchool);bjHeadquarters.add(tOffice1);bjHeadquarters.add(aOffice1);bjHeadquarters.handleArchives();
}
}
注:
本题也可以将员工(Employee)作为叶子构件,将Unit作为容器构件。
5.某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能
可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全部拷贝到移动存储介质(例如MMC卡或SD卡)中。
在实现过程中需要与多个已有的类进行交互,例如通讯录管理类、短信管理类等,为了降低系统的耦合度,试使用外观模式来设计并编程模拟实现该一键备份功能。
参考答案:
参考类图如下所示:
其中,OneKeyBackup充当外观角色,ContactManager、MessageManager和FileManager充当子系统角色。
6.某信息系统需要提供一个数据处理和报表显示模块,该模块可以读取不同类型的文件中的数据并将数据转换成XML格式,然后对数据进行统计分析,最后以报表方式来显示数据。
由于该过程需要涉及到多个类,试使用外观模式设计该数据处理和报表显示模块。
考虑到有些文件本身已经是XML格式,无须进行格式转换,为了让系统具有更好的扩展性,在系统设计中可以引入抽象外观类。
参考答案:
实验3
1.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法method()调用之前输出“方法method()被调用,调用时间为2014-11-510:
10:
10”,调用之后如果没有抛异常则输出“方法method()调用成功”,否则输出“方法method()调用失败”。
在代理类中调用真实业务类的业务方法,使用代理模式设计该日志记录模块的结构,绘制类图并编程模拟实现。
参考答案:
2.某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:
(1)在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;
(2)在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。
该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。
试使用代理模式设计并编程模拟实现该收费商务信息查询系统。
【提示:
使用保护代理和智能引用代理】参考答案:
3.某企业的SCM(SupplyChainManagement,供应链管理)系统中包含一个采购审批子系统。
该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。
如下图所示:
参考答案:
4.某公司欲开发一个软件系统的在线文档帮助系统,用户可以在任何一个查询上下文
中输入查询关键字,如果当前查询环境下没有相关内容,则系统会将查询按照一定的顺序转发给其他查询环境。
基于上述需求,试采用职责链模式对该系统进行设计。
参考答案:
5.房间中的开关就是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,绘制相应的类图并编程模拟实现。
参考答案:
参考类图如下所示:
其中,Switch充当调用者(发送者)角色,Command是抽象命令类,LampCommand和FanCommand充当具体命令角色,Lamp和Fan充当接收者角色。
6.某软件公司欲开发一个基于Windows平台的公告板系统。
系统提供一个主菜单
(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。
菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。
现使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计模式 设计模式刘伟 实验参考答案 设计 模式 刘伟 实验 参考答案