1CENTRALSOUTHUNIVERSITY《软件体系结构》实验报告实验名称设计模式实验二学生姓名实验三设计模式实验二一、实验目的熟练使用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(),每一个菜单项包含一个抽象命令类,具体命令类包括3OpenCommand(打开命令),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.使用任意一种面向对象编程语言实现外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式实例,代码运行正确无误。4四、实验步骤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模型,也无须单独提交源代码。5六、实验结果1.类图:ContactManager+OneKeyBackup():voidSmsManager+OneKeyBackup():voidBackupFacade----smssongcontactphoto:SmsManager:SongsManager:ContactManager:PhotoManager++ConstructorBackupFacade()OneKeyBackup()...:voidPhotoManager+OneKeyBackup():voidSongsManager+OneKeyBackup():void实现代码:Client.javapackagedm.facade;publicclassClient{publicstaticvoidmain(String[]args){BackupFacadebf=newBackupFacade();bf.oneKeyBackup();}}BackupFacade.javapackagedm.facade;publicclassBackupFacade{privateSmsManagersms;privateSongsManagersong;privateContactManagercontact;privatePhotoManagerphoto;publicBackupFacade(){sms=newSmsManager();song=newSongsManager();contact=newContactManager();photo=newPhotoManager();6}publicvoidoneKeyBackup(){sms.oneKeyBackup();song.oneKeyBackup();contact.oneKeyBackup();photo.oneKeyBackup();}}SmsManager.javapackagedm.facade;publicclassSmsManager{publicvoidoneKeyBackup(){System.out.println(SmsBackupOver);}}SongsManager.javapackagedm.facade;publicclassSongsManager{publicvoidoneKeyBackup(){System.out.println(SongsBackupOver);}}PhotoManager.javapackagedm.facade;publicclassPhotoManager{publicvoidoneKeyBackup(){//TODO:implementSystem.out.println(PhotoBackupOver);}}7ContactManager.javapackagedm.facade;publicclassContactManager{publicvoidoneKeyBackup(){System.out.println(ContactBackupOver);}}2.类图:Proxy-service:RealService+Implementmethod()...:voidRealService+Implementmethod()...:voidService+method()...:void实现代码:Client.javapackagedm.proxy;publicclassClient{publicstaticvoidmain(String[]args){Serviceservice;service=newProxy();service.method();}}Proxy.javapackagedm.proxy;publicclassProxyimplementsService{privateRealServiceservice=newRealService();publicvoidmethod(){service.method();}8}Service.javapackagedm.proxy;publicinterfaceService{voidmethod();}RealService.javapackagedm.proxy;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Random;publicclassRealServiceimplementsService{publicvoidmethod(){try{Datedate=newDate(