设计模式刘伟 实验参考答案.docx
- 文档编号:9056143
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:32
- 大小:266.69KB
设计模式刘伟 实验参考答案.docx
《设计模式刘伟 实验参考答案.docx》由会员分享,可在线阅读,更多相关《设计模式刘伟 实验参考答案.docx(32页珍藏版)》请在冰豆网上搜索。
设计模式刘伟实验参考答案
-本页仅作为预览文档封面,使用时请删除本页-
《设计模式》刘伟实验参考答案(总21页)
《设计模式》刘伟实验参考答案
实验1
1.在某图形库API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:
Circle
+
+
+
+
+
init()
setColor()
fill()
setSize()
display()
:
void
void
:
void
:
void
:
void
:
Triangle
+
+
+
+
+
init()
setColor()
fill()
setSize()
display()
void
:
:
void
void
:
void
:
void
:
Rectangle
+
+
+
+
+
init()
setColor()
fill()
setSize()
display()
void
:
void
:
:
void
:
void
:
void
Client
在该图形库中,每个图形类(如Circle、Triangle等)的init()方法用于初始化所创建的图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:
1由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;
2在图形库中增加并使用新的图形时需要修改客户类源代码;
3客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:
1隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;
2客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
参考答案:
2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形
(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制draw()和擦除erase()
两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,绘制类图并编程模拟实现。
参考答案:
ShapeFactory
createShape(Stringtype):
Shape
+
Circle
+
+
draw()
erase()
:
void
:
void
Triangle
+
+
draw()
erase()
:
void
void
:
Shape
+
+
draw()
erase()
:
void
:
void
Rectangle
+
+
draw()
erase()
:
void
:
void
UnsupportedShapeException
(
+
UnsupportedShapeException
Stringmessage)
3.现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。
图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。
试使用工厂方法模式设计该程序,绘制类图并编程模拟实现。
需充分考虑系统的灵活性和可扩展性。
参考答案:
4.某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。
不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:
该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。
试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。
参考答案:
5.使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限个,例如两个或三个,设计并编写代码实现一个多例类。
参考答案:
Multiton
-array:
Multiton[]
-Multiton()
+getInstance():
Multiton
+random():
int
多例模式(MultitonPattern)是单例模式的一种扩展形式,多例类可以有多个实例,而且必须自行创建和管理实例,并向外界提供自己的实例,可以通过静态集合对象来存储这些实
例。
多例类Multiton的代码如下所示:
import.*;
publicclassMultiton
{
使用单例模式设计一个多文档窗口(注:
在JavaAWT/Swing开发中可使用
JDesktopPane和JInternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次,即只能弹出一个相同的子窗体,如下图所示,编程实现该功能。
(注:
用C#或C++实现类似功能也可以)参考答案:
SubFrame
-
frame:
SubFrame
-
+
SubFrame()
getFrame()
:
SubFrame
MyIFListener
MainClass
-
-
-
button
desktopPane
iFrame
:
JButton
:
JDesktopPane
:
SubFrame
+
()
MainClass
BtListener
SubFrame类充当单例类,在其中定义了静态工厂方法getFrame()。
代码如下所示:
import.*;importimport.*;import
OperationAdapter
-
-
sortObj
searchObj
QuickSort
:
:
BinarySearch
+
+
+
OperationAdapter(QuickSortsortObj,
BinarySearchsearchObj)
sort(intarray[])
search(intarray[],intkey)
:
[]
int
:
int
DataOperation
+
+
sort(intarray[])
search(intarray[],intkey)
int
[]
:
:
int
QuickSort
+
+
+
+
quickSort(intarray[])
sort(intarray[],intp,intr)
partition(inta[],intp,intr)
swap(inta[],inti,intj)
[]
int
:
void
:
int
:
void
:
BinarySearch
+
binarySearch(intarray[],intkey):
int
Client
MediaPlayerWindow
MainWindow
MediaPlayerFactory
+
+
createMainWindow()
createPlayerList()
MainWindow
:
PlayerList
:
PlayerFactory
+
+
createMainWindow()
createPlayerList()
:
MainWindow
:
PlayerList
ClientClass
RealPlayerFactory
+
+
createMainWindow()
createPlayerList()
MainWindow
:
:
PlayerList
RealPlayerWindow
MediaPlayerList
PlayerList
RealPlayerList
MediaPlayerAPI
RealPlayerAPI
北京总部
教务办公室
湖南
分校
行政办公室
长沙教学点
湘潭教学点
教务办公室
行政办公室
教务办公室
行政办公室
教务办公室
行政办公室
list
Unit
{
abstract}
+
handleArchives():
void
Office
name:
String
-
+
+
Office(Stringname)
handleArchives()
:
void
Institution
-
-
list
name
:
ArrayList
:
String
+
+
+
Institution(Stringname)
add(Unitunit)
handleArchives()
:
void
:
void
andleArchives();
}
}
在客户类中创建树形结构,代码如下所示:
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("湘潭行政办公室");(tOffice3);(aOffice3);(tOffice4);(aOffice4);(csTeachingPost);(xtTeachingPost);(tOffice2);(aOffice2);(hnSubSchool);(tOffice1);(aOffice1);();
}
}
注:
本题也可以将员工(Employee)作为叶子构件,将Unit作为容器构件。
3.某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能
可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全部拷贝到移动存储介质(例如MMC卡或SD卡)中。
在实现过程中需要与多个已有的类进行交互,例如通讯录管理类、短信管理类等,为了降低系统的耦合度,试使用外观模式来设计并编程模拟实现该一键备份功能。
参考答案:
参考类图如下所示:
OneKeyBackup
-
-
-
cm
mm
fm
ContactManager
:
MessageManager
:
:
FileManager
+
click():
void
ContactManager
+
backup():
void
MessageManager
+
backup():
void
FileManager
+
backup():
void
其中,OneKeyBackup充当外观角色,ContactManager、MessageManager和FileManager充当子系统角色。
4.某信息系统需要提供一个数据处理和报表显示模块,该模块可以读取不同类型的文件中的数据并将数据转换成XML格式,然后对数据进行统计分析,最后以报表方式来显示数据。
由于该过程需要涉及到多个类,试使用外观模式设计该数据处理和报表显示模块。
考虑到有些文件本身已经是XML格式,无须进行格式转换,为了让系统具有更好的扩展性,在系统设计中可以引入抽象外观类。
参考答案:
AbstractFacade
abstract}
{
+
()
execute
XMLFacade
+
execute
()
ExtendedFacade
+
execute
()
FileOperation
+
read
()
XMLDataConvertor
+
convert
()
ReportDisplay
+
display
()
DataAnalysis
()
+
handle
实验3
1.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法method()调用之前输出“方法method()被调用,调用时间为2014-11-510:
10:
10”,调用之后如果没有抛异常则输出“方法method()调用成功”,否则输出“方法method()调用失败”。
在代理类中调用真实业务类的业务方法,使用代理模式设计该日志记录模块的结构,绘制类图并编程模拟实现。
参考答案:
BusinessClass
method():
void
+
AbstractLog
+
method():
void
LoggerProxy
-
business:
BusinessClass
+
+
LoggerProxy()
method()
:
void
Client
2.某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:
(1)在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;
(2)在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。
该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。
试使用代理模式设计并编程模拟实现该收费商务信息查询系统。
【提示:
使用保护代理和智能引用代理】参考答案:
ProxySearcher
-
-
-
searcher
validator
logger
:
RealSearcher
AccessValidator
:
Logger
:
+
+
+
doSearch()
validate()
log()
String
:
boolean
:
void
:
Searcher
+
doSearch():
String
RealSearcher
doSearch():
String
+
AccessValidator
+
validate():
boolean
Logger
+
log():
void
3.某企业的SCM(SupplyChainManagement,供应链管理)系统中包含一个采购审批子系统。
该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。
如下图所示:
参考答案:
4.某公司欲开发一个软件系统的在线文档帮助系统,用户可以在任何一个查询上下文
中输入查询关键字,如果当前查询环境下没有相关内容,则系统会将查询按照一定的顺序转发给其他查询环境。
基于上述需求,试采用职责链模式对该系统进行设计。
参考答案:
successor
SearchContext
abstract}
{
#successor:
SearchContext
+
+
setSuccessor(SearchContextsuccessor)
search(Stringkeyword)
:
void
:
void
JavaSearchContext
+
search(Stringkeyword):
void
UMLSearchContext
+
search(Stringkeyword):
void
Client
SQLSearchContext
+
search(Stringkeyword):
void
5.房间中的开关就是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,绘制相应的类图并编程模拟实现。
参考答案:
参考类图如下所示:
Switch
+
+
on()
off()
void
:
void
:
Command
+
+
executeOn()
executeOff()
:
void
:
void
LampCommand
-
lamp:
Lamp
+
+
executeOn()
executeOff()
:
void
:
void
Lamp
+
+
lighten()
quench()
:
void
:
void
FanCommand
-
fan:
Fan
+
+
executeOn()
executeOff()
:
void
:
void
Fan
+
+
run()
stop()
:
void
:
void
其中,Switch充当调用者(发送者)角色,Command是抽象命令类,LampCommand和FanCommand充当具体命令角色,Lamp和Fan充当接收者角色。
6.某软件公司欲开发一个基于Windows平台的公告板系统。
系统提供一个主菜单
(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。
菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。
现使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程实现。
参考答案:
BoardScreen
-
menu:
Menu
+
+
+
+
+
BoardScreen()
display()
open()
create()
edit()
:
void
:
void
:
void
:
void
Menu
+
itemList:
ArrayList
addMenuItem(MenuItemitem):
void
+
MenuItem
-
-
name
command
:
String
:
Command
+
+
+
+
+
+
MenuItem(Stringname)
getName()
setName(Stringname)
getCommand()
setCommand(Commandcommand)
click()
:
String
:
void
:
Command
:
void
void
:
Command
+
execute():
void
OpenCommand
-
screen:
BoardScreen
+
+
OpenCommand(BoardScreenscreen)
:
execute()
void
CreateCommand
-
screen:
BoardScreen
+
+
CreateCommand(BoardScreenscreen)
execute()
:
void
EditCommand
-
screen:
BoardScreen
+
+
EditCommand(BoardScreenscreen)
void
execute()
:
其中,BoardScreen充当接收者角色,MenuItem充当调用者角色,Command充当抽象命令角色,OpenCommand、CreateCommand和EditCommand充当具体命令角色。
实验4
1.某实时在线股票软件需要提供如下功能:
当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的所有股民。
试使用观察者模式设计并实现该系统,要求绘制相应的类图并编程模拟实现。
参考答案:
investors
ConcreteInvestor
name:
String
-
+
+
ConcreteInvestor(S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计模式刘伟 实验参考答案 设计 模式 实验 参考答案