设计模式试验三讲解_第1页
设计模式试验三讲解_第2页
设计模式试验三讲解_第3页
设计模式试验三讲解_第4页
设计模式试验三讲解_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CENTRAL SOUTH UNIVERSITY软件体系结构实验报告实验名称设计模式实验二学生姓名 学生学号 XXX专业班级软件工程 1007 班指导教师 刘伟完成时间2012 年 12月 25 日实验三 设计模式实验二一、实验目的熟练使用 PowerDesigner 和任意一种面向对象编程语言实现几种常见的设计模式,包括 外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、策略模式和模板 方法模式, 理解每一种设计模式的模式动机, 掌握模式结构, 学习如何使用代码实现这些模 式,并学会分析这些模式的使用效果。二、实验内容使用 PowerDesigner 和任意一种面向对象编程语

2、言实现外观模式、代理模式、职责链模 式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式,包括根据实例绘制模 式结构图、编写模式实例实现代码,运行并测试模式实例代码。(1) 外观模式 某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能, 通过该功能可以 将原本存储在手机中的通信录、 短信、照片、歌曲等资料一次性全部拷贝到移动存储介质 (例 如 MMC 卡或 SD 卡)中。在实现过程中需要与多个已有的类进行交互, 例如通讯录管理类、 短信管理类等, 为了降低系统的耦合度, 试使用外观模式来设计并编程模拟实现该一键备份 功能。(2) 代理模式在某应用软件中需要记录业务方法的调用日

3、志, 在不修改现有业务类的基础上为每一个 类提供一个日志记录代理类, 在代理类中输出日志, 如在业务方法 method()调用之前输出 “方 法 method()被调用, 调用时间为 2010-10-10 10:10:10 ”,调用之后如果没有抛异常则输出 “方 法 method()成功调用”,否则输出“方法 method() 调用失败”。在代理类中调用真实业务类的 业务方法,使用代理模式设计该日志记录功能的结构,绘制类图并编程模拟实现。(3) 职责链模式某企业的 SCM(Supply Chain Management,供应链管理 ) 系统中包含一个采购审批子系 统。该企业的采购审批是分级进行

4、的, 即根据采购金额的不同由不同层次的主管人员来审批, 主任可以审批 5 万元以下(不包括 5 万元)的采购单,副董事长可以审批 5 万元至 10 万元 (不包括 10 万元)的采购单,董事长可以审批 10 万元至 50 万元(不包括 50 万元) 的采购 单, 50 万元及以上的采购单就需要开董事会讨论决定。试使用职责链模式设计并实现该系 统。(4) 命令模式 某软件公司欲开发一个基于 Windows 平台的公告板系统。 系统提供一个主菜单 (Menu) , 在主菜单中包含了一些菜单项 (MenuItem) ,可以通过 Menu 类的 addMenuItem() 方法增加菜 单项。菜单项的主

5、要方法是 click() ,每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令) , CreateCommand(新建命令) , EditCommand (编辑命令)等, 命令类具有一个 execute()方法,用于调用公告板系统界面类 (BoardScreen)的 open()、create()、 edit()等方法。试使用命令模式设计该系统,使得MenuItem 类与 BoardScreen 类的耦合度降低,绘制类图并编程模拟实现。(5) 迭代器模式 在某在线购物系统的购物车 (Shopping Cart) 中包含了一个存储商品名称的字符串数组, 现需要自定义一

6、个双向迭代器 (MyIterator) 实现对该商品名称数组的双向 (前向和后向) 遍历。 绘制类图并编程模拟实现(要求定义抽象层) 。(6) 观察者模式某在线股票软件需要提供如下功能: 当股票购买者所购买的某支股票价格变化幅度达到 5%时,系统将自动发送通知(包括新价格)给购买该股票的股民。现使用观察者模式设计 该系统,绘制类图并编程模拟实现(要求定义抽象层) 。(7) 策略模式 某软件公司欲开发一款飞机模拟系统, 该系统主要模拟不同种类飞机的飞行特征与起飞 特征,需要模拟的飞机种类及其特征如表 1 所示:表 1 飞机种类及特征一览表飞机种类起飞特征飞行特征直升机 (Helicopter)垂

7、直起飞 (VerticalTakeOff)亚音速飞行 (SubSonicFly)客机 (AirPlane)长距离起飞 (LongDistanceTakeOff)亚音速飞行 (SubSonicFly)歼击机 (Fighter)长距离起飞 (LongDistanceTakeOff)超音速飞行 (SuperSonicFly)鹞式战斗机 (Harrier)垂直起飞 (VerticalTakeOff)超音速飞行 (SuperSonicFly)为将来能够模拟更多种类的飞机,试采用策略模式设计并模拟实现该飞机模拟系统。(8) 模板方法模式 某软件公司欲为某银行的业务支撑系统开发一个利息计算模块,利息计算流程

8、如下:I. 系统根据账号和密码验证用户信息,如果用户信息错误,系统显示出错提示;II. 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如 活期账户和定期账户具有不同的利息计算公式) ;III. 系统显示利息。试使用模板方法模式设计并模拟实现该利息计算模块。三、实验要求1. 正确无误绘制外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者 模式、策略模式和模板方法模式实例的模式结构图;2. 使用任意一种面向对象编程语言实现外观模式、代理模式、职责链模式、命令模式、 迭代器模式、观察者模式、策略模式和模板方法模式实例,代码运行正确无误。四、实验步骤1. 进一步熟悉

9、PowerDesigner15 的常用功能;2. 使用 PowerDesigner 绘制外观模式实例结构图并用面向对象编程语言实现该模式实 例;3. 使用 PowerDesigner 绘制代理模式实例结构图并用面向对象编程语言实现该模式实 例;4. 使用 PowerDesigner 绘制职责链模式实例结构图并用面向对象编程语言实现该模式 实例;5. 使用 PowerDesigner 绘制命令模式实例结构图并用面向对象编程语言实现该模式实 例;6. 使用 PowerDesigner 绘制迭代器模式实例结构图并用面向对象编程语言实现该模式 实例;7. 使用 PowerDesigner 绘制观察者模

10、式实例结构图并用面向对象编程语言实现该模式 实例;8. 使用 PowerDesigner 绘制策略模式实例结构图并用面向对象编程语言实现该模式实 例;9. 使用 PowerDesigner 绘制模板方法模式实例结构图并用面向对象编程语言实现该模 式实例。五、实验报告要求1. 提供外观模式实例结构图及实现代码;2. 提供代理模式实例结构图及实现代码;3. 提供职责链模式实例结构图及实现代码;4. 提供命令模式实例结构图及实现代码;5. 提供迭代器模式实例结构图及实现代码;6. 提供观察者模式实例结构图及实现代码;7. 提供策略模式实例结构图及实现代码;8. 提供模板方法模式实例结构图及实现代码;

11、9. 注意调整类图中文字的字体及字号,注意图的整体布局和图的大小,避免使用交叉 线,注意代码字体和颜色,代码字体需一致,颜色需统一;10. 认真写好实验总结;11. 提交电子版实验报告, 格式为“学号 -姓名-实验 3.doc”,如“060102-张三 -实验 3.doc”, 所有材料(包括类图和源代码)均放在一个 Word 文件中,格式为 doc 或 docx,不需要提交 PowerDeigner 所保存的 oom 模型,也无须单独提交源代码。六、实验结果1. 类图:实现代码:Client.java package dm.facade; public class Client public

12、static void main(String args) BackupFacade bf = new BackupFacade(); bf.oneKeyBackup();BackupFacade.java package dm.facade;public class BackupFacade private SmsManager sms;private SongsManager song;private ContactManager contact;private PhotoManager photo; public BackupFacade() sms = new SmsManager()

13、; song = new SongsManager(); contact = new ContactManager(); photo = new PhotoManager();public void oneKeyBackup() sms.oneKeyBackup(); song.oneKeyBackup(); contact.oneKeyBackup(); photo.oneKeyBackup();SmsManager.javapackage dm.facade;public class SmsManager public void oneKeyBackup() System.out.prin

14、tln(Sms Backup Over);SongsManager.javapackage dm.facade;public class SongsManager public void oneKeyBackup() System.out.println(Songs Backup Over);PhotoManager.javapackage dm.facade;public class PhotoManager public void oneKeyBackup() / TODO: implementSystem.out.println(Photo Backup Over);ContactMan

15、ager.java package dm.facade; public class ContactManager public void oneKeyBackup() System.out.println(Contact Backup Over);2. 类图:实现代码:Client.javapackage xy;public class Client public static void main(String args) Service service; service = new Proxy(); service.method();Proxy.javapackage dm.pr

16、oxy;public class Proxy implements Service private RealService service = new RealService(); public void method() service.method();Service.javapackage xy;public interface Service void method();RealService.javapackage xy;import java.text.SimpleDateFormat;import java.util.Date;import java.ut

17、il.Random;public class RealService implements Service public void method() try Date date = new Date();/ format 对象是用来以指定的时间格式格式化时间的SimpleDateFormat from = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); / 这里的格式可以自己设置/ format() 方法是用来格式化时间的方法String times = from.format(date);System.out.println( 方法 method() 被

18、调用,调用时间为 : + times);/用来产生除零异常来模拟 method 方法调用是否成功Random random = new Random();int a = random.nextInt(100);int b = random.nextInt(10);SuppressWarnings(unused)int c = a/b;System.out.println( 方法 method() 成功调用 ); catch (Exception e) / TODO: handle exceptionSystem.out.println( 方法 method() 调用失败 );3. 类图:实现代

19、码:Client.javapackage dm.chainofresponsibility;public class Client public static void main(String args) Leader objDirector, objDepartmentManager, objGeneralManager;objDirector = new Director( 张三 ); objDepartmentManager = new Manager( 李四 );objGeneralManager = new GeneralManager( 王五 );objDirector.setSu

20、ccessor(objDepartmentManager); objDepartmentManager.setSuccessor(objGeneralManager);System.out.println();PurchaseRequest shopping1 = new PurchaseRequest(10000.00, 购买打印纸 ); objDirector.handleRequest(shopping1);System.out.println();PurchaseRequest shopping2 = new PurchaseRequest(80000.00, 办公室配置空调 );ob

21、jDirector.handleRequest(shopping2);System.out.println();PurchaseRequest shopping3 = new PurchaseRequest(150000.00, 车间维修 );objDirector.handleRequest(shopping3);System.out.println();PurchaseRequest shopping4 = new PurchaseRequest(10000000.00, 收购 RL 公司 );objDirector.handleRequest(shopping4);System.out.

22、println();PurchaseRequest.javapackage dm.chainofresponsibility;public class PurchaseRequest private double billMoney;private String reason;public PurchaseRequest(double billMoney, String reason) this.billMoney = billMoney;this.reason = reason;public double getBillMoney() return billMoney;public void

23、 setBillMoney(double billMoney) this.billMoney = billMoney;public String getReason() return reason;public void setReason(String reason) this.reason = reason;10Leader.javapackage dm.chainofresponsibility;public abstract class Leader protected String name;protected Leader successor;public void setSucc

24、essor(Leader seccessor) this.successor = seccessor;public Leader(String name) = name;public abstract void handleRequest(PurchaseRequest request);Manager.javapackage dm.chainofresponsibility;public class Manager extends Leader public Manager(String name) super(name);public void handleReques

25、t(PurchaseRequest request) if (request.getBillMoney() 100000.00) System.out.println( 总经理 + name + 处理物资采购: + request.getReason()+ ,批准采购资金为: + request.getBillMoney() + RMB); else if (this.successor != null) this.successor.handleRequest(request);11GeneralManager.javapackage dm.chainofresponsibility;pub

26、lic class GeneralManager extends Leader public GeneralManager(String name) super(name);public void handleRequest(PurchaseRequest request) if (request.getBillMoney() 500000.00) System.out.println( 总经理 + name + 处理物资采购: + request.getReason()+ ,批准采购资金为: + request.getBillMoney() + RMB); else System.out.p

27、rintln( 董事会将开会处理物资采购: + request.getReason()+ ,批准采购资金为: + request.getBillMoney() + RMB);Director.javapackage dm.chainofresponsibility;public class Director extends Leader public Director(String name) super(name);public void handleRequest(PurchaseRequest request) if (request.getBillMoney() 50000.00) S

28、ystem.out.println( 主任 + name + 处理物资采购: + request.getReason()+ ,批准采购资金为: + request.getBillMoney() + RMB); else if (this.successor != null) 12this.successor.handleRequest(request);4. 类图:Menu- menuItemList : ArrayList+ addMenuItem (MenuItem item): void+ getMenuItemByName (String itemName): MenuItem1.10

29、.*MenuItem-itemName command: String: Command+click (): void+MenuItem (String name, Command cmd)+getItemName (): String+setItemName (String newItemName): void+getCommand (): Command+setCommand (Command newCommand): void1.1CommandCommand+ execute () : void.EditCommand- myBoardScreen: BoardScreen+ exec

30、ute () : void1.1OpenCommand- myBoardScreen : BoardScreen+ execute () : void1.1 1.1BoardScreen1.11.1+ open () :void+ create () :void+ edit () :voidCreateCommand- myBoardScreen: BoardScreen+ execute () : void1.1实现代码:Client.java package mand; public class Client public static void main(String args) Boa

31、rdScreen screen =new BoardScreen();Menu menu = new Menu();MenuItem open = new MenuItem(open, new OpenCommand(screen);13 MenuItem create = new MenuItem(create, new CreateCommand(screen); MenuItem edit = new MenuItem(edit, new EditCommand(screen); menu.addMenuItem(open);menu.addMenuItem(create);menu.a

32、ddMenuItem(edit);menu.getMenuItemByName(open).click();menu.getMenuItemByName(create).click();menu.getMenuItemByName(edit).click();Menu.javapackage mand;import java.util.*;public class Menu private ArrayList menuItemList = new ArrayList();public void addMenuItem(MenuItem item) / TODO: implementthis.m

33、enuItemList.add(item);public MenuItem getMenuItemByName(String itemName) / TODO: implementfor (int i = 0; i menuItemList.size(); i+) if (menuItemList.get(i).getItemName().equals(itemName) return menuItemList.get(i);return null;MenuItem.javapackage mand;public class MenuItem 14 private String itemNam

34、e; private Command command; public void click() / TODO: implementSystem.out.println(MenuItem + this.itemName + clicked!); mand.execute();public MenuItem(String name, Command cmd) / TODO: implement mand = cmd; this.itemName = name;public String getItemName() return itemName;public void setItemName(St

35、ring newItemName) itemName = newItemName;public Command getCommand() return command;public void setCommand(Command newCommand) mand = newCommand;Command.java package mand; public interface Command 15void execute();CreateCommand.java package mand; public class CreateCommand implements Command private

36、 BoardScreen myBoardScreen; public CreateCommand(BoardScreen myBoardScreen) this.myBoardScreen = myBoardScreen;public void execute() / TODO: implement myBoardScreen.create();EditCommand.java package mand; public class EditCommand implements Command private BoardScreen myBoardScreen;public EditComman

37、d(BoardScreen myBoardScreen)this.myBoardScreen = myBoardScreen;public void execute() / TODO: implement myBoardScreen.edit();OpenCommand.java package mand; public class OpenCommand implements Command 16 private BoardScreen myBoardScreen; public OpenCommand(BoardScreen myBoardScreen) this.myBoardScree

38、n = myBoardScreen;public void execute() / TODO: implement myBoardScreen.open();BoardScreen.java package mand; public class BoardScreen public void open() / TODO: implementSystem.out.println(BoardScreen opened!);public void create() / TODO: implementSystem.out.println(BoardScreen create!);public void

39、 edit() / TODO: implementSystem.out.println(BoardScreen edit!);175. 类图:MyCollection+createIterator () : MyIterator.NewCollection- obj : Object+ createIterator () : MyIteratorMyIterator+first () :void+last () :void+hasNext () :boolean+hasPrevious () :boolean+next () :void+previous () :void+isFirst ()

40、 :boolean+isLast () :boolean+getCurrentItem ():Object.-currentIndex : int+first (): void+last (): void+hasNext (): boolean+hasPrevious (): boolean+next (): void+previous (): void+isFirst (): boolean+isLast (): boolean+getCurrentItem (): ObjectNewIterator实现代码:Client.javapackage dm.iterator;public cla

41、ss Client public static void main(String args) MyCollection collection = new NewCollection(); MyIterator i = collection.createIterator(); System.out.println( 正向遍历 );i.first();System.out.print(i.getCurrentItem().toString() + ); while (i.hasNext() i.next();System.out.print(i.getCurrentItem().toString(

42、) + );System.out.println(n 逆向遍历 );i.last(); System.out.print(i.getCurrentItem().toString() + ); while (i.hasPrevious() i.previous();System.out.print(i.getCurrentItem().toString() + );18System.out.println();MyIterator.java package dm.iterator; public interface MyIterator void first();void last(); boo

43、lean hasNext(); boolean hasPrevious();void next();void previous(); boolean isFirst(); boolean isLast();Object getCurrentItem();MyCollection.java package dm.iterator; public interface MyCollection MyIterator createIterator();NewCollection.java package dm.iterator; public class NewCollection implement

44、s MyCollection private Object obj = I, P, h, o, n, e ;public MyIterator createIterator() / TODO: implement return new NewIterator();19/ 内部类迭代器public class NewIterator implements MyIterator private int currentIndex = 0;public void first() / TODO: implement currentIndex = 0;public void last() / TODO:

45、implement currentIndex = obj.length - 1;public boolean hasNext() / TODO: implementif (currentIndex 0) return true;return false;public void next() / TODO: implement if (currentIndex 0) currentIndex-;public boolean isFirst() / TODO: implementreturn currentIndex = 0;public boolean isLast() / TODO: impl

46、ementreturn currentIndex = obj.length - 1;public Object getCurrentItem() / TODO: implementreturn objcurrentIndex;6. 类图:21实现代码:Client.javapackage dm.observer;public class Client public static void main(String args) / TODO Auto-generated method stubStock stock = new Stock(1000.0); new Stocker(zhangsan

47、, stock); new Stocker(lisi, stock); stock.setPrice(1234.0);stock.setPrice(1234.5); stock.setPrice(999.9);stock.setPrice(1111.1);Observer.javapackage dm.observer;public interface Observer void response();Subject.java package dm.observer; import java.util.*;public abstract class Subject private Vector

48、 vector = new Vector();public void addObserver(Observer observer) / TODO: implement this.vector.add(observer);public void deleteObserver(Observer observer) / TODO: implement this.vector.remove(observer);22public void fireNotice()for(int i=0;i 0.05 | change / this.price -0.05) super.fireNotice();Stoc

49、ker.javapackage dm.observer;23public class Stocker implements Observer private String name;private Stock subject;public Stock stock;public Stocker(String name, Stock subject) / TODO: implement = name;this.subject = subject; subject.addObserver(this);public void response() / TODO: implement

50、System.out.println( 股民 + name + 被通知股票发生了变化 ,新价格为 : + subject.getPrice();- flyBehavior : FlyBehavior- takeOffBehavio: rTakeOffBehavior7. 类图:AirCraftabstract+ setFlyBehavior (FlyBehavior newFlyBehavior) : voidr)FlyBehavio+ irCraft (FlyBehavior flyBehavior, TakeOffBehavior takeOffBehaviTakeOffBehaviorSubSonicFly+ fly (): void+ fly (): voidSuperSonicFlyfly (): void+ takeOff (:) voidVerticalTakeOffLon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论