《设计模式》刘伟实验参考答案Word下载.docx
- 文档编号:4832687
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:24
- 大小:669.49KB
《设计模式》刘伟实验参考答案Word下载.docx
《《设计模式》刘伟实验参考答案Word下载.docx》由会员分享,可在线阅读,更多相关《《设计模式》刘伟实验参考答案Word下载.docx(24页珍藏版)》请在冰点文库上搜索。
试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。
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!
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)
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类的耦合度降低,绘制类图并编程实现。
其中,BoardScreen充当
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计模式 设计 模式 实验 参考答案
![提示](https://static.bingdoc.com/images/bang_tan.gif)