




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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,供应链管理)系统中包含一个采购审批子系统。该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的
4、采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。试使用职责链模式设计并实现该系统。(4) 命令模式某软件公司欲开发一个基于Windows平台的公告板系统。系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand
5、(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。试使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程模拟实现。(5) 迭代器模式在某在线购物系统的购物车(Shopping Cart)中包含了一个存储商品名称的字符串数组,现需要自定义一个双向迭代器(MyIterator)实现对该商品名称数组的双向(前向和后向)遍历。绘制类图并编程模拟实现(要求定义抽象层)。(6) 观察者模式某在线股票软件需要提供如下功能:当股票购买者所购买的某支股票价格
6、变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的股民。现使用观察者模式设计该系统,绘制类图并编程模拟实现(要求定义抽象层)。(7) 策略模式某软件公司欲开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,需要模拟的飞机种类及其特征如表1所示:表1 飞机种类及特征一览表飞机种类起飞特征飞行特征直升机(Helicopter)垂直起飞(VerticalTakeOff)亚音速飞行(SubSonicFly)客机(AirPlane)长距离起飞(LongDistanceTakeOff)亚音速飞行(SubSonicFly)歼击机(Fighter)长距离起飞(LongDist
7、anceTakeOff)超音速飞行(SuperSonicFly)鹞式战斗机(Harrier)垂直起飞(VerticalTakeOff)超音速飞行(SuperSonicFly)为将来能够模拟更多种类的飞机,试采用策略模式设计并模拟实现该飞机模拟系统。(8) 模板方法模式某软件公司欲为某银行的业务支撑系统开发一个利息计算模块,利息计算流程如下:I. 系统根据账号和密码验证用户信息,如果用户信息错误,系统显示出错提示;II. 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式);III. 系统显示利息。试使用模板方法模式设计并模拟实现该利
8、息计算模块。三、实验要求1. 正确无误绘制外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式实例的模式结构图;2. 使用任意一种面向对象编程语言实现外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式实例,代码运行正确无误。四、实验步骤1. 进一步熟悉PowerDesigner15的常用功能;2. 使用PowerDesigner绘制外观模式实例结构图并用面向对象编程语言实现该模式实例;3. 使用PowerDesigner绘制代理模式实例结构图并用面向对象编程语言实现该模式实例;4. 使用PowerDesigner绘制职责
9、链模式实例结构图并用面向对象编程语言实现该模式实例;5. 使用PowerDesigner绘制命令模式实例结构图并用面向对象编程语言实现该模式实例;6. 使用PowerDesigner绘制迭代器模式实例结构图并用面向对象编程语言实现该模式实例;7. 使用PowerDesigner绘制观察者模式实例结构图并用面向对象编程语言实现该模式实例;8. 使用PowerDesigner绘制策略模式实例结构图并用面向对象编程语言实现该模式实例;9. 使用PowerDesigner绘制模板方法模式实例结构图并用面向对象编程语言实现该模式实例。五、实验报告要求1. 提供外观模式实例结构图及实现代码;2. 提供代理
10、模式实例结构图及实现代码;3. 提供职责链模式实例结构图及实现代码;4. 提供命令模式实例结构图及实现代码;5. 提供迭代器模式实例结构图及实现代码;6. 提供观察者模式实例结构图及实现代码;7. 提供策略模式实例结构图及实现代码;8. 提供模板方法模式实例结构图及实现代码;9. 注意调整类图中文字的字体及字号,注意图的整体布局和图的大小,避免使用交叉线,注意代码字体和颜色,代码字体需一致,颜色需统一;10. 认真写好实验总结;11. 提交电子版实验报告,格式为“学号-姓名-实验3.doc”,如“060102-张三-实验3.doc”,所有材料(包括类图和源代码)均放在一个Word文件中,格式为
11、doc或docx,不需要提交PowerDeigner所保存的oom模型,也无须单独提交源代码。六、实验结果1. 类图:实现代码:Client.javapackage dm.facade;public class Client public static void main(String args) BackupFacade bf = new BackupFacade();bf.oneKeyBackup();BackupFacade.javapackage dm.facade;public class BackupFacade private SmsManager sms;private Son
12、gsManager song;private ContactManager contact;private PhotoManager photo;public BackupFacade() sms = new SmsManager();song = new SongsManager();contact = new ContactManager();photo = new PhotoManager();public void oneKeyBackup() sms.oneKeyBackup();song.oneKeyBackup();contact.oneKeyBackup();photo.one
13、KeyBackup();SmsManager.javapackage dm.facade;public class SmsManager public void oneKeyBackup() System.out.println("Sms Backup Over");SongsManager.javapackage dm.facade;public class SongsManager public void oneKeyBackup() System.out.println("Songs Backup Over");PhotoManager.javap
14、ackage dm.facade;public class PhotoManager public void oneKeyBackup() / TODO: implement System.out.println("Photo Backup Over"); ContactManager.javapackage dm.facade;public class ContactManager public void oneKeyBackup() System.out.println("Contact Backup Over");2. 类图:实现代码:Client
15、.javapackage xy;public class Client public static void main(String args) Service service;service = new Proxy();service.method();Proxy.javapackage xy;public class Proxy implements Service private RealService service = new RealService();public void method() service.method();Service.javapac
16、kage xy;public interface Service void method();RealService.javapackage xy;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random;public class RealService implements Service public void method() try Date date = new Date();/ format对象是用来以指定的时间格式格式化时间的SimpleDateForma
17、t from = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); / 这里的格式可以自己设置/ format()方法是用来格式化时间的方法String times = from.format(date);System.out.println("方法method()被调用,调用时间为:" + times); /用来产生除零异常来模拟method方法调用是否成功Random random = new Random();int a = random.nextInt(100);int b = random.nextInt
18、(10);SuppressWarnings("unused")int c = a/b;System.out.println("方法method()成功调用"); catch (Exception e) / TODO: handle exceptionSystem.out.println("方法method()调用失败");3. 类图:实现代码:Client.javapackage dm.chainofresponsibility;public class Client public static void main(String ar
19、gs) Leader objDirector, objDepartmentManager, objGeneralManager;objDirector = new Director("张三");objDepartmentManager = new Manager("李四");objGeneralManager = new GeneralManager("王五");objDirector.setSuccessor(objDepartmentManager);objDepartmentManager.setSuccessor(objGen
20、eralManager);System.out.println("-");PurchaseRequest shopping1 = new PurchaseRequest(10000.00, "购买打印纸");objDirector.handleRequest(shopping1);System.out.println("-");PurchaseRequest shopping2 = new PurchaseRequest(80000.00, "办公室配置空调");objDirector.handleRequest(
21、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(
22、shopping4);System.out.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 getBillM
23、oney() return billMoney;public void setBillMoney(double billMoney) this.billMoney = billMoney;public String getReason() return reason;public void setReason(String reason) this.reason = reason;Leader.javapackage dm.chainofresponsibility;public abstract class Leader protected String name;protected Lea
24、der successor;public void setSuccessor(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) sup
25、er(name);public void handleRequest(PurchaseRequest request) if (request.getBillMoney() < 100000.00) System.out.println("总经理" + name + "处理物资采购:" + request.getReason()+ ",批准采购资金为:" + request.getBillMoney() + "RMB"); else if (this.successor != null) this.succe
26、ssor.handleRequest(request);GeneralManager.javapackage dm.chainofresponsibility;public class GeneralManager extends Leader public GeneralManager(String name) super(name);public void handleRequest(PurchaseRequest request) if (request.getBillMoney() < 500000.00) System.out.println("总经理" +
27、 name + "处理物资采购:" + request.getReason()+ ",批准采购资金为:" + request.getBillMoney() + "RMB"); else System.out.println("董事会将开会处理物资采购:" + request.getReason()+ ",批准采购资金为:" + request.getBillMoney() + "RMB");Director.javapackage dm.chainofresponsibili
28、ty;public class Director extends Leader public Director(String name) super(name);public void handleRequest(PurchaseRequest request) if (request.getBillMoney() < 50000.00) System.out.println("主任" + name + "处理物资采购:" + request.getReason()+ ",批准采购资金为:" + request.getBillM
29、oney() + "RMB"); else if (this.successor != null) this.successor.handleRequest(request);4. 类图:实现代码:Client.javapackage mand;public class Client public static void main(String args) BoardScreen screen = new BoardScreen();Menu menu = new Menu();MenuItem open = new MenuItem("open", n
30、ew OpenCommand(screen);MenuItem create = new MenuItem("create", new CreateCommand(screen);MenuItem edit = new MenuItem("edit", new EditCommand(screen);menu.addMenuItem(open);menu.addMenuItem(create);menu.addMenuItem(edit);menu.getMenuItemByName("open").click();menu.getM
31、enuItemByName("create").click();menu.getMenuItemByName("edit").click();Menu.javapackage mand;import java.util.*;public class Menu private ArrayList<MenuItem> menuItemList = new ArrayList<MenuItem>();public void addMenuItem(MenuItem item) / TODO: implementthis.menuItem
32、List.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 private String itemName;pri
33、vate Command command;public void click() / TODO: implementSystem.out.println("MenuItem " + this.itemName + " clicked!");mand.execute();public MenuItem(String name, Command cmd) / TODO: implementmand = cmd;this.itemName = name;public String getItemName() return itemName;public voi
34、d setItemName(String newItemName) itemName = newItemName;public Command getCommand() return command;public void setCommand(Command newCommand) mand = newCommand;Command.javapackage mand;public interface Command void execute();CreateCommand.javapackage mand;public class CreateCommand implements Comma
35、nd private BoardScreen myBoardScreen;public CreateCommand(BoardScreen myBoardScreen) this.myBoardScreen = myBoardScreen;public void execute() / TODO: implementmyBoardScreen.create();EditCommand.javapackage mand;public class EditCommand implements Command private BoardScreen myBoardScreen;public Edit
36、Command(BoardScreen myBoardScreen)this.myBoardScreen = myBoardScreen;public void execute() / TODO: implementmyBoardScreen.edit();OpenCommand.javapackage mand;public class OpenCommand implements Command private BoardScreen myBoardScreen;public OpenCommand(BoardScreen myBoardScreen) this.myBoardScreen
37、 = myBoardScreen;public void execute() / TODO: implementmyBoardScreen.open();BoardScreen.javapackage mand;public class BoardScreen public void open() / TODO: implementSystem.out.println("BoardScreen opened!");public void create() / TODO: implementSystem.out.println("BoardScreen create
38、!");public void edit() / TODO: implementSystem.out.println("BoardScreen edit!");5. 类图:实现代码:Client.javapackage dm.iterator;public class Client public static void main(String args) MyCollection collection = new NewCollection();MyIterator i = collection.createIterator();System.out.printl
39、n("正向遍历-");i.first();System.out.print(i.getCurrentItem().toString() + " ");while (i.hasNext() i.next();System.out.print(i.getCurrentItem().toString() + " ");System.out.println("n逆向遍历-");i.last();System.out.print(i.getCurrentItem().toString() + " ");w
40、hile (i.hasPrevious() i.previous();System.out.print(i.getCurrentItem().toString() + " ");System.out.println();MyIterator.javapackage dm.iterator;public interface MyIterator void first();void last();boolean hasNext();boolean hasPrevious();void next();void previous();boolean isFirst();boolea
41、n isLast();Object getCurrentItem();MyCollection.javapackage dm.iterator;public interface MyCollection MyIterator createIterator();NewCollection.javapackage dm.iterator;public class NewCollection implements MyCollection private Object obj = "I", "P", "h", "o",
42、"n", "e" ;public MyIterator createIterator() / TODO: implementreturn new NewIterator();/ 内部类迭代器public class NewIterator implements MyIterator private int currentIndex = 0;public void first() / TODO: implementcurrentIndex = 0;public void last() / TODO: implementcurrentIndex = obj.
43、length - 1;public boolean hasNext() / TODO: implementif (currentIndex < obj.length - 1) return true;return false;public boolean hasPrevious() / TODO: implementif (currentIndex > 0) return true;return false;public void next() / TODO: implementif (currentIndex < obj.length) currentIndex+;publ
44、ic void previous() / TODO: implementif (currentIndex > 0) currentIndex-;public boolean isFirst() / TODO: implementreturn currentIndex = 0;public boolean isLast() / TODO: implementreturn currentIndex = obj.length - 1;public Object getCurrentItem() / TODO: implementreturn objcurrentIndex;6. 类图:实现代码
45、: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", stock);new Stocker("lisi", stock);stock.setPrice(1234.0);stock.setPrice(1234.5);stock.setPrice(999.9);
46、stock.setPrice(1111.1);Observer.javapackage dm.observer;public interface Observer void response();Subject.javapackage dm.observer;import java.util.*;public abstract class Subject private Vector<Observer> vector = new Vector<Observer>();public void addObserver(Observer observer) / TODO: i
47、mplementthis.vector.add(observer);public void deleteObserver(Observer observer) / TODO: implementthis.vector.remove(observer);public void fireNotice() for(int i=0;i<vector.size();i+)(Observer)vector.elementAt(i).response(); Stock.javapackage dm.observer;public class Stock extends Subject private
48、double price;public Stock(double price) / TODO Auto-generated constructor stubthis.price = price;public double getPrice() return price;public void setPrice(double newPrice) double change = this.price - newPrice;price = newPrice;if (change / this.price > 0.05 | change / this.price < -0.05) supe
49、r.fireNotice();Stocker.javapackage dm.observer;public class Stocker implements Observer private String name;private Stock subject;public Stock stock;public Stocker(String name, Stock subject) / TODO: = name;this.subject = subject;subject.addObserver(this);public void response() /
50、TODO: implementSystem.out.println("股民 " + name + " 被通知股票发生了变化,新价格为:"+ subject.getPrice();7. 类图:实现代码:Client.javapackage dm.strategy;public class Client public static void main(String args) / TODO Auto-generated method stubFlyBehavior flyBehavior;flyBehavior = new SubSonicFly();Tak
51、eOffBehavior takeOffBehavior;takeOffBehavior = new VerticalTakeOff();new Helicopter(flyBehavior, takeOffBehavior);System.out.println("-");flyBehavior = new SubSonicFly();takeOffBehavior = new LongDistanceTakeOff();new AirPlane(flyBehavior, takeOffBehavior);System.out.println("-")
52、;flyBehavior = new SuperSonicFly();takeOffBehavior = new LongDistanceTakeOff();new Fighter(flyBehavior, takeOffBehavior);System.out.println("-");flyBehavior = new SuperSonicFly();takeOffBehavior = new VerticalTakeOff();new Harrier(flyBehavior, takeOffBehavior);AirCraft.javapackage dm.strategy;public class AirCraft private FlyBehavior flyBehavior;private TakeOffBeh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论