設計模式實驗三_第1頁
設計模式實驗三_第2頁
設計模式實驗三_第3頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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) 模板方法模式 某軟件公司欲為某銀行的業務支撐系統開發一個利息計算模塊,利息計算流程如下:I

8、. 系統根據賬號和密碼驗證用戶信息,如果用戶信息錯誤,系統顯示出錯提示;II. 如果用戶信息正確,則根據用戶類型的不同使用不同的利息計算公式計算利息(如 活期賬戶和定期賬戶具有不同的利息計算公式) ;III. 系統顯示利息。試使用模板方法模式設計并模擬實現該利息計算模塊。三、實驗要求1. 正確無誤繪制外觀模式、代理模式、職責鏈模式、命令模式、迭代器模式、觀察者 模式、策略模式和模板方法模式實例的模式結構圖;2. 使用任意一種面向對象編程語言實現外觀模式、代理模式、職責鏈模式、命令模式、 迭代器模式、觀察者模式、策略模式和模板方法模式實例,代碼運行正確無誤。四、實驗步驟1. 進一步熟悉 Powe

9、rDesigner15 的常用功能;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. 提供模板方法模式實例結構圖及實現代碼;9. 注

11、意調整類圖中文字的字體及字號,注意圖的整體布局和圖的大小,避免使用交叉 線,注意代碼字體和顏色,代碼字體需一致,顏色需統一;10. 認真寫好實驗總結;11. 提交電子版實驗報告, 格式為“學號 -姓名-實驗 3.doc”,如“060102-張三 -實驗 3.doc”, 所有材料(包括類圖和源代碼)均放在一個 Word 文件中,格式為 doc 或 docx,不需要提交 PowerDeigner 所保存的 oom 模型,也無須單獨提交源代碼。六、實驗結果1. 類圖:實現代碼:Client.java package dm.facade; public class Client public stat

12、ic 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(); s

13、ong = 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.println

14、("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("Ph

15、oto Backup Over");ContactManager.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 Prox

16、y(); service.method();Proxy.javapackage xy;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.SimpleDa

17、teFormat;import java.util.Date;import java.util.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 ti

18、mes = from.format(date);System.out.println(" 方法 method() 被調用,調用時間為 :" + 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() 成功調用 ");

19、 catch (Exception e) / TODO: handle exceptionSystem.out.println(" 方法 method() 調用失敗 ");3. 類圖:實現代碼:Client.javapackage dm.chainofresponsibility;public class Client public static void main(String args) Leader objDirector, objDepartmentManager, objGeneralManager;objDirector = new Director("

20、; 張三 ");objDepartmentManager = new Manager(" 李四 "); objGeneralManager = new GeneralManager(" 王五 ");objDirector.setSuccessor(objDepartmentManager); objDepartmentManager.setSuccessor(objGeneralManager);System.out.println("");PurchaseRequest shopping1 = new PurchaseRe

21、quest(10000.00, "購買打印紙 "); objDirector.handleRequest(shopping1);System.out.println("");PurchaseRequest shopping2 = new PurchaseRequest(80000.00, "辦公室配置空調 ");objDirector.handleRequest(shopping2);System.out.println("");PurchaseRequest shopping3 = new PurchaseReq

22、uest(150000.00, "車間維修 ");objDirector.handleRequest(shopping3);System.out.println("");PurchaseRequest shopping4 = new PurchaseRequest(10000000.00, "收購 RL 公司 ");objDirector.handleRequest(shopping4);System.out.println("");PurchaseRequest.javapackage dm.chainofres

23、ponsibility;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 setBillMoney(double billMoney) this.billMoney = bi

24、llMoney;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 Leader successor;public void setSuccessor(Leader seccessor) this.successor = seccessor;pu

25、blic 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 handleRequest(PurchaseRequest request) if (request.getBillMoney()

26、 < 100000.00) System.out.println(" 總經理 " + name + " 處理物資采購: " + request.getReason()+ " ,批準采購資金為: " + request.getBillMoney() + "RMB"); else if (this.successor != null) this.successor.handleRequest(request);GeneralManager.javapackage dm.chainofresponsibility;

27、public 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()+ " ,批準采購資金為: " +

28、 request.getBillMoney() + "RMB"); else System.out.println(" 董事會將開會處理物資采購: " + request.getReason()+ " ,批準采購資金為: " + request.getBillMoney() + "RMB");Director.javapackage dm.chainofresponsibility;public class Director extends Leader public Director(String name) s

29、uper(name);public void handleRequest(PurchaseRequest request) if (request.getBillMoney() < 50000.00) System.out.println(" 主任 " + name + " 處理物資采購: " + request.getReason()+ " ,批準采購資金為: " + request.getBillMoney() + "RMB"); else if (this.successor != null) this

30、.successor.handleRequest(request);4. 類圖:Menu- menuItemList : ArrayList+ addMenuItem (MenuItem item): void+ getMenuItemByName (String itemName): MenuItem1.10.*MenuItem-itemName command: String: Command+click (): void+<<Constructor>>MenuItem (String name, Command cmd)+<<Getter>>

31、;getItemName (): String+<<Setter>>setItemName (String newItemName): void+<<Getter>>getCommand (): Command+<<Setter>>setCommand (Command newCommand): void1.1CommandCommand+ execute () : void.EditCommand- myBoardScreen: BoardScreen+ <<Implement>>execute

32、() : voidOpenCommand- myBoardScreen: BoardScreen+ <<Implement>>execute () : void1.11.1BoardScreenCreateCommand- myBoardScreen: BoardScreen+ <<Implement>>execute () : void1.1+ open (): void+ create (): void+ edit (): void實現代碼:Client.java package mand; public class Client publi

33、c static void main(String args) BoardScreen screen =new BoardScreen();Menu menu = new Menu();MenuItem open = new MenuItem("open", new OpenCommand(screen); MenuItem create = new MenuItem("create", new CreateCommand(screen); MenuItem edit = new MenuItem("edit", new EditCo

34、mmand(screen); menu.addMenuItem(open);menu.addMenuItem(create);menu.addMenuItem(edit);menu.getMenuItemByName("open").click();menu.getMenuItemByName("create").click();menu.getMenuItemByName("edit").click();Menu.javapackage mand;import java.util.*;public class Menu privat

35、e ArrayList<MenuItem> menuItemList = new ArrayList<MenuItem>();public void addMenuItem(MenuItem item) / TODO: implementthis.menuItemList.add(item);public MenuItem getMenuItemByName(String itemName) / TODO: implementfor (int i = 0; i < menuItemList.size(); i+) if (menuItemList.get(i).g

36、etItemName().equals(itemName) return menuItemList.get(i);return null;private String itemName; private Command command; public void click() / TODO: implementSystem.out.println("MenuItem " + this.itemName + " clicked!"); mand.execute();public MenuItem(String name, Command cmd) / TO

37、DO: implement mand = cmd; this.itemName = name;public String getItemName() return itemName;public void setItemName(String newItemName) itemName = newItemName;public Command getCommand() return command;public void setCommand(Command newCommand) mand = newCommand;void execute();CreateCommand.java pack

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

39、nts Command private BoardScreen myBoardScreen;public EditCommand(BoardScreen myBoardScreen)this.myBoardScreen = myBoardScreen;public void execute() / TODO: implement myBoardScreen.edit();private BoardScreen myBoardScreen; public OpenCommand(BoardScreen myBoardScreen) this.myBoardScreen = myBoardScre

40、en;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!");pu

41、blic void edit() / TODO: implementSystem.out.println("BoardScreen edit!");5. 類圖:MyIteratorMyCollection+ createIterator (): MyIterator.+first (): void+last (): void+hasNext (): boolean+hasPrevious (): boolean+next (): void+previous (): void+isFirst (): boolean+isLast (): boolean+getCurrentI

42、tem (): ObjectNewCollection- obj : Object+ <<Implement>>createIterator (): MyIteratorNewIterator-currentIndex :int+<<Implement>>first (): void+<<Implement>>last (): void+<<Implement>>hasNext (): boolean+<<Implement>>hasPrevious (): boolean+

43、<<Implement>>next (): void+<<Implement>>previous (): void+<<Implement>>isFirst (): boolean+<<Implement>>isLast (): boolean+<<Implement>>getCurrentItem (): Object實現代碼:Client.java package dm.iterator; public class Client public static void ma

44、in(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() + &q

45、uot; ");");System.out.println("n 逆向遍歷i.last(); System.out.print(i.getCurrentItem().toString() + " "); while (i.hasPrevious() i.previous();System.out.print(i.getCurrentItem().toString() + " ");System.out.println();MyIterator.java package dm.iterator;public interface

46、 MyIterator void first();void last();boolean hasNext(); boolean hasPrevious();void next();void previous(); boolean isFirst(); boolean isLast();Object getCurrentItem();MyCollection.java package dm.iterator;public interface MyCollection MyIterator createIterator();NewCollection.javapackage dm.iterator

47、;public class NewCollection implements MyCollection private Object obj = "I", "P", "h", "o", "n", "e" ;public MyIterator createIterator() / TODO: implementreturn new NewIterator();/ 內部類迭代器public class NewIterator implements MyIterator priva

48、te int currentIndex = 0;public void first() / TODO: implement currentIndex = 0;public void last() / TODO: implement currentIndex = obj.length - 1;public boolean hasNext() / TODO: implementif (currentIndex < obj.length - 1) return true;return false;public boolean hasPrevious() / TODO: implement if

49、 (currentIndex > 0) return true;return false;public void next() / TODO: implement if (currentIndex < obj.length) currentIndex+;public void previous() / TODO: implement if (currentIndex > 0) currentIndex-;public boolean isFirst() / TODO: implementreturn currentIndex = 0;public boolean isLast

50、() / TODO: implementreturn currentIndex = obj.length - 1;public Object getCurrentItem() / TODO: implementreturn objcurrentIndex;6. 類圖:實現代碼:Client.javapackage dm.observer;public class Client public static void main(String args) / TODO Auto-generated method stubStock stock = new Stock(1000.0); new Sto

51、cker("zhangsan", 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

52、abstract class Subject private Vector<Observer> vector = new Vector<Observer>();public void addObserver(Observer observer) / TODO: implement this.vector.add(observer);public void deleteObserver(Observer observer) / TODO: implement this.vector.remove(observer);public void fireNotice()for(

53、int i=0;i<vector.size();i+)(Observer)vector.elementAt(i).response();Stock.javapackage dm.observer;public class Stock extends Subject private double price;public Stock(double price) / TODO Auto-generated constructor stubthis.price = price;public double getPrice() return price;public void setPrice(

54、double newPrice) double change = this.price - newPrice; price = newPrice;if (change / this.price > 0.05 | change / this.price < -0.05) super.fireNotice();public class Stocker implements Observer private String name;private Stock subject;public Stock stock;public Stocker(String name, Stock subj

55、ect) / TODO: implement = name;this.subject = subject; subject.addObserver(this);public void response() / TODO: implementSystem.out.println(" 股民 " + name + " 被通知股票發生了變化 ,新價格為 :" + subject.getPrice();- flyBehavior : FlyBehavior- takeOffBehavio: rTakeOffBehavior7. 類圖:AirCr

56、aftabstract+ <<Setter>> setFlyBehavior (FlyBehavior newFlyBehavior) : void+ <<ConstructorA>>irCraft (FlyBehavior flyBehavior, TakeOffBehavior takeOffBehavior)FlyBehavioTakeOffBehaiorSubSonicFly+ fly (): void+ takeOff (:) voi+ <<Override>f>ly (): voidAirPlane+ <

57、<Override>fl>y (): voidVerticalTakeOffLongDistanceTakeOff+ <<Override>t>akeOff (:) void+ <<Override>t>akeOff (:) voidHarrier+ <<ConstructorA>i>rPlane (FlyBehavior flyBehavior, TakeOffBehavior takeOffBehavior)+ <<ConstructorH>a>rrier (FlyBehavior flyBehavior, TakeOffBehavior takeOffBehavior)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論