设计模式实验三.docx
《设计模式实验三.docx》由会员分享,可在线阅读,更多相关《设计模式实验三.docx(36页珍藏版)》请在冰豆网上搜索。
设计模式实验三
CENTRALSOUTHUNIVERSITY
《软件体系结构》实验报告
实验名称设计模式实验二
学生姓名
学生学号XXX
专业班级软件工程1007班
指导教师刘伟
完成时间2012年12月25日
实验三设计模式实验二
一、实验目的
熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容
使用PowerDesigner和任意一种面向对象编程语言实现外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。
(1)外观模式
某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全部拷贝到移动存储介质(例如MMC卡或SD卡)中。
在实现过程中需要与多个已有的类进行交互,例如通讯录管理类、短信管理类等,为了降低系统的耦合度,试使用外观模式来设计并编程模拟实现该一键备份功能。
(2)代理模式
在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,如在业务方法method()调用之前输出“方法method()被调用,调用时间为2010-10-1010:
10:
10”,调用之后如果没有抛异常则输出“方法method()成功调用”,否则输出“方法method()调用失败”。
在代理类中调用真实业务类的业务方法,使用代理模式设计该日志记录功能的结构,绘制类图并编程模拟实现。
(3)职责链模式
某企业的SCM(SupplyChainManagement,供应链管理)系统中包含一个采购审批子系统。
该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。
试使用职责链模式设计并实现该系统。
(4)命令模式
某软件公司欲开发一个基于Windows平台的公告板系统。
系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。
菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。
试使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程模拟实现。
(5)迭代器模式
在某在线购物系统的购物车(ShoppingCart)中包含了一个存储商品名称的字符串数组,现需要自定义一个双向迭代器(MyIterator)实现对该商品名称数组的双向(前向和后向)遍历。
绘制类图并编程模拟实现(要求定义抽象层)。
(6)观察者模式
某在线股票软件需要提供如下功能:
当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的股民。
现使用观察者模式设计该系统,绘制类图并编程模拟实现(要求定义抽象层)。
(7)策略模式
某软件公司欲开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,需要模拟的飞机种类及其特征如表1所示:
表1飞机种类及特征一览表
飞机种类
起飞特征
飞行特征
直升机(Helicopter)
垂直起飞(VerticalTakeOff)
亚音速飞行(SubSonicFly)
客机(AirPlane)
长距离起飞(LongDistanceTakeOff)
亚音速飞行(SubSonicFly)
歼击机(Fighter)
长距离起飞(LongDistanceTakeOff)
超音速飞行(SuperSonicFly)
鹞式战斗机(Harrier)
垂直起飞(VerticalTakeOff)
超音速飞行(SuperSonicFly)
为将来能够模拟更多种类的飞机,试采用策略模式设计并模拟实现该飞机模拟系统。
(8)模板方法模式
某软件公司欲为某银行的业务支撑系统开发一个利息计算模块,利息计算流程如下:
I.系统根据账号和密码验证用户信息,如果用户信息错误,系统显示出错提示;
II.如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式);
III.系统显示利息。
试使用模板方法模式设计并模拟实现该利息计算模块。
三、实验要求
1.正确无误绘制外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式实例的模式结构图;
2.使用任意一种面向对象编程语言实现外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式实例,代码运行正确无误。
四、实验步骤
1.进一步熟悉PowerDesigner15的常用功能;
2.使用PowerDesigner绘制外观模式实例结构图并用面向对象编程语言实现该模式实例;
3.使用PowerDesigner绘制代理模式实例结构图并用面向对象编程语言实现该模式实例;
4.使用PowerDesigner绘制职责链模式实例结构图并用面向对象编程语言实现该模式实例;
5.使用PowerDesigner绘制命令模式实例结构图并用面向对象编程语言实现该模式实例;
6.使用PowerDesigner绘制迭代器模式实例结构图并用面向对象编程语言实现该模式实例;
7.使用PowerDesigner绘制观察者模式实例结构图并用面向对象编程语言实现该模式实例;
8.使用PowerDesigner绘制策略模式实例结构图并用面向对象编程语言实现该模式实例;
9.使用PowerDesigner绘制模板方法模式实例结构图并用面向对象编程语言实现该模式实例。
五、实验报告要求
1.提供外观模式实例结构图及实现代码;
2.提供代理模式实例结构图及实现代码;
3.提供职责链模式实例结构图及实现代码;
4.提供命令模式实例结构图及实现代码;
5.提供迭代器模式实例结构图及实现代码;
6.提供观察者模式实例结构图及实现代码;
7.提供策略模式实例结构图及实现代码;
8.提供模板方法模式实例结构图及实现代码;
9.注意调整类图中文字的字体及字号,注意图的整体布局和图的大小,避免使用交叉线,注意代码字体和颜色,代码字体需一致,颜色需统一;
10.认真写好实验总结;
11.提交电子版实验报告,格式为“学号-姓名-实验3.doc”,如“060102-张三-实验3.doc”,所有材料(包括类图和源代码)均放在一个Word文件中,格式为doc或docx,不需要提交PowerDeigner所保存的oom模型,也无须单独提交源代码。
六、实验结果
1.类图:
实现代码:
Client.java
packagedm.facade;
publicclassClient{
publicstaticvoidmain(String[]args){
BackupFacadebf=newBackupFacade();
bf.oneKeyBackup();
}
}
BackupFacade.java
packagedm.facade;
publicclassBackupFacade{
privateSmsManagersms;
privateSongsManagersong;
privateContactManagercontact;
privatePhotoManagerphoto;
publicBackupFacade(){
sms=newSmsManager();
song=newSongsManager();
contact=newContactManager();
photo=newPhotoManager();
}
publicvoidoneKeyBackup(){
sms.oneKeyBackup();
song.oneKeyBackup();
contact.oneKeyBackup();
photo.oneKeyBackup();
}
}
SmsManager.java
packagedm.facade;
publicclassSmsManager{
publicvoidoneKeyBackup(){
System.out.println("SmsBackupOver");
}
}
SongsManager.java
packagedm.facade;
publicclassSongsManager{
publicvoidoneKeyBackup(){
System.out.println("SongsBackupOver");
}
}
PhotoManager.java
packagedm.facade;
publicclassPhotoManager{
publicvoidoneKeyBackup(){
//TODO:
implement
System.out.println("PhotoBackupOver");
}
}
ContactManager.java
packagedm.facade;
publicclassContactManager{
publicvoidoneKeyBackup(){
System.out.println("ContactBackupOver");
}
}
2.类图:
实现代码:
Client.java
packagedm.proxy;
publicclassClient{
publicstaticvoidmain(String[]args){
Serviceservice;
service=newProxy();
service.method();
}
}
Proxy.java
packagedm.proxy;
publicclassProxyimplementsService{
privateRealServiceservice=newRealService();
publicvoidmethod(){
service.method();
}
}
Service.java
packagedm.proxy;
publicinterfaceService{
voidmethod();
}
RealService.java
packagedm.proxy;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.Random;
publicclassRealServiceimplementsService{
publicvoidmethod(){
try{
Datedate=newDate();
//format对象是用来以指定的时间格式格式化时间的
SimpleDateFormatfrom=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");//这里的格式可以自己设置
//format()方法是用来格式化时间的方法
Stringtimes=from.format(date);
System.out.println("方法method()被调用,调用时间为:
"+times);
//用来产生除零异常来模拟method方法调用是否成功
Randomrandom=newRandom();
inta=random.nextInt(100);
intb=random.nextInt(10);
@SuppressWarnings("unused")
intc=a/b;
System.out.println("方法method()成功调用");
}catch(Exceptione){
//TODO:
handleexception
System.out.println("方法method()调用失败");
}
}}
3.类图:
实现代码:
Client.java
packagedm.chainofresponsibility;
publicclassClient{
publicstaticvoidmain(String[]args){
LeaderobjDirector,objDepartmentManager,objGeneralManager;
objDirector=newDirector("张三");
objDepartmentManager=newManager("李四");
objGeneralManager=newGeneralManager("王五");
objDirector.setSuccessor(objDepartmentManager);
objDepartmentManager.setSuccessor(objGeneralManager);
System.out.println("---------------------------------------------");
PurchaseRequestshopping1=newPurchaseRequest(10000.00,"购买打印纸");
objDirector.handleRequest(shopping1);
System.out.println("---------------------------------------------");
PurchaseRequestshopping2=newPurchaseRequest(80000.00,"办公室配置空调");
objDirector.handleRequest(shopping2);
System.out.println("---------------------------------------------");
PurchaseRequestshopping3=newPurchaseRequest(150000.00,"车间维修");
objDirector.handleRequest(shopping3);
System.out.println("---------------------------------------------");
PurchaseRequestshopping4=newPurchaseRequest(10000000.00,"收购RL公司");
objDirector.handleRequest(shopping4);
System.out.println("---------------------------------------------");
}
}
PurchaseRequest.java
packagedm.chainofresponsibility;
publicclassPurchaseRequest{
privatedoublebillMoney;
privateStringreason;
publicPurchaseRequest(doublebillMoney,Stringreason){
this.billMoney=billMoney;
this.reason=reason;
}
publicdoublegetBillMoney(){
returnbillMoney;
}
publicvoidsetBillMoney(doublebillMoney){
this.billMoney=billMoney;
}
publicStringgetReason(){
returnreason;
}
publicvoidsetReason(Stringreason){
this.reason=reason;
}
}
Leader.java
packagedm.chainofresponsibility;
publicabstractclassLeader{
protectedStringname;
protectedLeadersuccessor;
publicvoidsetSuccessor(Leaderseccessor){
this.successor=seccessor;
}
publicLeader(Stringname){
this.name=name;
}
publicabstractvoidhandleRequest(PurchaseRequestrequest);
}
Manager.java
packagedm.chainofresponsibility;
publicclassManagerextendsLeader{
publicManager(Stringname){
super(name);
}
publicvoidhandleRequest(PurchaseRequestrequest){
if(request.getBillMoney()<100000.00){
System.out.println("总经理"+name+"处理物资采购:
"+request.getReason()
+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}else{
if(this.successor!
=null){
this.successor.handleRequest(request);
}
}
}
}
GeneralManager.java
packagedm.chainofresponsibility;
publicclassGeneralManagerextendsLeader{
publicGeneralManager(Stringname){
super(name);
}
publicvoidhandleRequest(PurchaseRequestrequest){
if(request.getBillMoney()<500000.00){
System.out.println("总经理"+name+"处理物资采购:
"+request.getReason()
+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}else{
System.out.println("董事会将开会处理物资采购:
"+request.getReason()
+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}
}
}
Director.java
packagedm.chainofresponsibility;
publicclassDirectorextendsLeader{
publicDirector(Stringname){
super(name);
}
publicvoidhandleRequest(PurchaseRequestrequest){
if(request.getBillMoney()<50000.00){
System.out.println("主任"+name+"处理物资采购:
"+request.getReason()
+",批准采购资金为:
"+request.getBillMoney()+"RMB");
}else{
if(this.successor!
=null){
this.successor.handleRequest(request);
}
}
}
}
4.类图:
实现代码:
Client.java
packagemand;
publicclassClient{
publicstaticvoidmain(String[]args){
BoardScreenscreen=newBoardScreen();
Menumenu=newMenu();
MenuItemopen=newMenuItem("open",newOpenCommand(screen));
MenuItemcreate=newMenuItem("create",newCreateCommand(screen));
MenuItemedit=newMenuItem("edit",newEditCommand(screen));
menu.addMenuItem(open);
menu.addMenuItem(create);
menu.addMenuItem(edit);
menu.getMenuItemByName("open").click();
menu.getMenuItemByName("create").click();
menu.getMenuItemByName("edit").click();
}
}
Menu.java
packa