中南大學(xué)軟件體系結(jié)構(gòu)設(shè)計模式實驗二_第1頁
中南大學(xué)軟件體系結(jié)構(gòu)設(shè)計模式實驗二_第2頁
中南大學(xué)軟件體系結(jié)構(gòu)設(shè)計模式實驗二_第3頁
中南大學(xué)軟件體系結(jié)構(gòu)設(shè)計模式實驗二_第4頁
中南大學(xué)軟件體系結(jié)構(gòu)設(shè)計模式實驗二_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、軟件體系結(jié)構(gòu)實驗報告項目名稱 設(shè)計模式實驗2專業(yè)班級學(xué) 號姓 名實驗成績:批閱教師:年 月 日實驗3設(shè)計模式實驗二實驗學(xué)時:4每組人數(shù):_J實驗類型:二 (1:基礎(chǔ)性2 :綜合性 3 :設(shè)計性4 :研究性)實驗要求:1 (1:必修 2 :選修3:其它)實驗類別:= (1:基礎(chǔ) 2 :專業(yè)基礎(chǔ)3 :專業(yè) 4 :其它) 一、實驗?zāi)康氖炀毷褂肞owerDesigner和任意一種面向?qū)ο缶幊陶Z言實現(xiàn)幾種常見的行 為型設(shè)計模式,包括職責(zé)鏈模式、命令模式、觀察者模式和策略模式,理解每一 種設(shè)計模式的模式動機,掌握模式結(jié)構(gòu),學(xué)習(xí)如何使用代碼實現(xiàn)這些模式。 二、實驗內(nèi)容1 .某企業(yè)的SCM(Supply Ch

2、ain Management,供應(yīng)鏈管理)系統(tǒng)中包含一個 采購審批子系統(tǒng)。該企業(yè)的采購審批是分級進行的,即根據(jù)采購金額的不同由不 同層次的主管人員來審批,主任可以審批5萬元以下(不包括5萬元)的采購單, 副董事長可以審批5萬元至10萬元(不包括10萬元)的采購單,董事長可以審 批10萬元至50萬元(不包括50萬元)的采購單,50萬元及以上的采購單就需 要開董事會討論決定。如下圖所示:試使用職責(zé)鏈模式設(shè)計并模擬實現(xiàn)該系統(tǒng)。2 .房間中的開關(guān)是命令模式的一個實例,現(xiàn)用命令模式來模擬開關(guān)的功能, 可控制對象包括電燈和電風(fēng)扇,繪制相應(yīng)的類圖并編程模擬實現(xiàn)。3 .某軟件公司欲開發(fā)一個基于Windows平

3、臺的公告板系統(tǒng)。系統(tǒng)提供一個 主菜單(Menu),在主菜單中包含了一些菜單項(MenuItem),可以通過Menu類的 addMenuItem()方法增加菜單項。菜單項的主要方法是 click(),每一個菜單項 包含一個抽象命令類,具體命令類包括 OpenCommand1開命令), CreateCommand新建命令),EditCommand編輯命令)等,命令類具有一個 execute。方法,用于調(diào)用公告板系統(tǒng)界面類 (BoardScreen)的open()、 create()、edit()等方法?,F(xiàn)使用命令模式設(shè)計該系統(tǒng),使得 MenuItem類與 BoardScreen類的耦合度降低,繪制

4、類圖并編程實現(xiàn)。4 .某實時在線股票軟件需要提供如下功能:當(dāng)股票購買者所購買的某支股 票價格變化幅度達到5%寸,系統(tǒng)將自動發(fā)送通知(包括新價格)給購買該股票 的所有股民。試使用觀察者模式設(shè)計并實現(xiàn)該系統(tǒng),要求繪制相應(yīng)的類圖并編程模擬實現(xiàn)。5 .某公司欲開發(fā)一套機房監(jiān)控系統(tǒng),如果機房達到某一指定溫度,溫度傳 感器(Thermosensor)將自動傳遞信號給各種響應(yīng)設(shè)備,例如警示燈 (CautionLight)將閃爍(flicker。)、報警器(Annunciator)將發(fā)出警報(alarm()、安全逃生門(SecuhtyDoor)將自動開啟(open()、隔熱門(InsulatedDoor) 將

5、自動關(guān)閉 (close() 等, 每一種響應(yīng)設(shè)備的行為由專門的程序來控制。 為了將來能夠方便地引入新類型的響應(yīng)設(shè)備, 采用觀察者模式和適配器 模式設(shè)計并模擬實現(xiàn)該系統(tǒng)。6. 某軟件公司為某電影院開發(fā)了一套影院售票系統(tǒng),在該系統(tǒng)中需要為不同類型的用戶提供不同的電影票(MovieTicket) 打折 (Discount) 方式,具體打折方案如下:(1) 學(xué)生憑學(xué)生證可享受票價8 折優(yōu)惠;(2) 年齡在 10 周歲及以下的兒童可享受每張票減免10 元的優(yōu)惠 (原始票價需大于等于 20 元) ;(3)影院VIP用戶除享受票價半價優(yōu)惠外還可進行積分,積分累計到一定額度可換取電影院贈送的獎品。該系統(tǒng)在將來

6、可能還要根據(jù)需要引入新的打折方式。試使用策略模式設(shè)計并編程模擬實現(xiàn)該影院售票系統(tǒng)。7. 為了實現(xiàn)一些特殊的顯示效果,某公司欲開發(fā)一款手機數(shù)碼照片處理軟件, 在該軟件中為照片 (Photograph) 提供了多種濾鏡(Filter) 效果, 例如黑白濾鏡 (BlackWhiteFilter) 、 單 色 濾 鏡 (MonochromaticFilter) 、 懷 舊 濾 鏡 (NostalgicFilter) 等,不同的濾鏡通過不同的算法對照片進行美化,如下圖所 示。該軟件可以靈活地增加一些新的濾鏡效果。選擇一種合適的設(shè)計模式來設(shè)計該照片處理軟件, 結(jié)合場景繪制相應(yīng)的類圖 并編程模擬實現(xiàn)。 三、

7、實驗要求1. 結(jié)合實例,正確無誤地繪制職責(zé)鏈模式、命令模式、觀察者模式和策略模式的模式結(jié)構(gòu)圖;2. 使用任意一種面向?qū)ο缶幊陶Z言實現(xiàn)職責(zé)鏈模式、命令模式、觀察者模式和策略模式實例,代碼運行正確無誤。四、實驗步驟1. 結(jié)合實例,使用 PowerDesigner 繪制職責(zé)鏈模式實例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實現(xiàn)該模式實例;2. 結(jié)合實例,使用PowerDesigner 繪制命令模式實例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實現(xiàn)該模式實例;3. 結(jié)合實例,使用PowerDesigner 繪制命令模式實例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實現(xiàn)該模式實例;4. 結(jié)合實例,使用PowerDesigner 繪制觀察者模式實例結(jié)

8、構(gòu)圖并用面向?qū)ο缶幊陶Z言實現(xiàn)該模式實例;5. 結(jié)合實例,使用PowerDesigner 繪制觀察者模式實例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實現(xiàn)該模式實例;6. 結(jié)合實例,使用PowerDesigner繪制策略模式實例結(jié)構(gòu)圖并用面向?qū)ο?編程語言實現(xiàn)該模式實例;7. 結(jié)合實例,使用PowerDesigner繪制策略模式實例結(jié)構(gòu)圖并用面向?qū)ο?編程語言實現(xiàn)該模式實例。五、實驗結(jié)果1 .類圖:實現(xiàn)代碼:public class PurchaseRequest public double amount;public int number;public String purpose;public double

9、 getAmount() return amount;public void setAmount( double amount) this .amount = amount;public int getNumber() return number;public void setNumber( int number) this .number = number;public String getPurpose() return purpose;public void setPurpose(String purpose) this .purpose = purpose;public class A

10、pprover protected Approver succesor;public Approver() succesor = null ;public void processRequest(PurchaseRequest aRequest) if (succesor!= null )cessRequest(aRequest);public void setSuccesor(Approver succesor) this .succesor = succesor;public class Congress extends Approver public void p

11、rocessRequest(PurchaseRequest request)if (request.getAmount()>=500000)System. out.println(" 董事會");public class Director extends Approver public void processRequest(PurchaseRequest request)if (request.getAmount()<50000)System. out.println(" 主任)else if (this .succesor!= null )this

12、 .cessRequest(request);public class President extends Approverpublic void processRequest(PurchaseRequest request)if (request.getAmount()<500000)System. out.println(" 董事長");else if (this .succesor!= null )this .cessRequest(request);public class VicePresident exten

13、ds Approverpublic void processRequest(PurchaseRequest request)if (request.getAmount()<100000)System. out.println(" 副董事長");else if (this .succesor!= null )this .cessRequest(request);2 .類圖:實現(xiàn)代碼:public abstract class AbstractCommand public abstract void open();public abstract v

14、oid close();public class Switch private Abstractcommand command;public void setCommand(AbstractCommand command) this .command = command;public void open() command.open();public void close() command.close();public class Fun public void open()System. out .println(" 開風(fēng)扇");public void close()S

15、ystem. out .println(" 關(guān)風(fēng)扇");public class Light public void open()System. out .println(" 打開)public void close()System. out .println(" 關(guān)燈)public class FunCommandextends Abstractcommand private Fun fun = newFun();Overridepublic void open() / TODCAuto-generated method stub fun.open()

16、;Overridepublic void close() / TODCAuto-generated method stub fun.close();public class LightCommand extends AbstractCommand private Light light = newLight();Overridepublic void open() / TODCAuto-generated method stub light.open();Overridepublic void close() / TODCAuto-generated method stub light.clo

17、se();3.類圖:實現(xiàn)代碼:public interface Command public void excute();public class Menuitem private String name;private Command command;public Menuitem(String name)this .name = name;public String getName() return name;public void setName(String name) this .name = name;public Command getCommand() return comma

18、nd;public void setCommand(Command command) this .command = command;public void click()command.excute();importnewArrayList();public class Menu public ArrayList itemList =public void addMenuItem(MenuItem item) 讓emList.add(item);public class OpenCommandmplements Command private BoardScreen screen;publi

19、c OpenCommand(BoardScreen screen) super ();this .screen = screen;Overridepublic void excute() / TODCAuto-generated method stub screen.open();public class CreateCommand implements Command private BoardScreen screen;public CreateCommand(BoardScreen screen) super ();this .screen = screen;Overridepublic

20、 void excute() / TODCAuto-generated method stub screen.create();public class 曰dtCommand implements Command private BoardScreen screen;public EidtCommand(BoardScreen screen) super ();this .screen = screen;Overridepublic void excute() / TODCAuto-generated method stub screen.edit();public class BoardSc

21、reen private Menu menu;private Menuitem openltem,createltem,editltem;public BoardScreen()menu = newMenu();openitem = newMenuItem(" 打開"); createitem = new MenuItem(" 新建”); edititem = newMenuItem("編輯) menu.addMenultem(openltem);menu.addMenuitem(createitem);menu.addMenuItem(editltem

22、);public void display()System. out .println("主菜單選項:");for (Object obj : menu.itemList)System. out.println(MenuItem)obj).getName();public void open()System. out .println("顯示打開窗口!");public void create()System. out .println("顯示新建窗 口!");public void edit()System. out .printl

23、n("顯示編輯窗 口!");public Menu getMenu()return menu;#.類圖:實現(xiàn)代碼:public interface Investor public void response(Stock stck);public class Concreteinvestor implements Investor private String name;public ConcreteInvestor(String name) super ();this .name = name;Overridepublic void response(Stock stock

24、) / TODCAuto-generated method stubSystem. out .println(name+":");System. out .println(stock.getStockName()+”漲幅超過5%”);System. out .println(" 新價格"+stock.getPrice();importpublic class Stock private ArrayList<Investor> investors;private String stockName;private double price;pub

25、lic Stock(String stockName, double price) super ();this .stockName = stockName;this .price = price;investors = newArrayList<Investor>();public void attach(Investor investor) investors.add(investor);public void detach(Investor investor) investors.remove(investor);public void notifyInvestor()for

26、 (Object obj : investors"(Investor)obj).response( this );public String getStockName() return stockName;public void setStockName(String stockName) this .stockName = stockName;public double getPrice() return price;public void setPrice( double price) double range = Math. abs(price- this .price)/ t

27、his .price;this .price = price;if (range>=0.05)this .notifyInvestor();public class Client public static void main(String口 args) Investor investor1,investor2;investor1 = newConcreteInvestor(" 哈哈)investor2 = newConcreteInvestor(" 呵呵)Stock haier = newStock("haier”, 20.00);haier.attach

28、(investor1);haier.attach(investor2);haier.setPrice(25.00);5.類圖:實現(xiàn)代碼:public interface AlarmListener public void response。;public class Annunciator implements AlarmListener private Annunciator annunciator;Overridepublic void response。/ TODCAuto-generated method stubannunciator.alarm();public void alar

29、m()System. out .println("報警器警報”);public class CautionLight implements AlarmListener private CautionLight light;Overridepublic void response() / TODCAuto-generated method stublight.flicker();public void flicker()System. out .println("警示燈閃爍");public class InsulatedDoor implements AlarmL

30、istener private InsulatedDoor insulatedDoor;Overridepublic void response。/ TODCAuto-generated method stubinsulatedDoor.close();public void close()System.out.println(" 隔熱門關(guān)閉");public class SecurityDoor implements AlarmListener private SecurityDoor securityDoor;Overridepublic void response()

31、 / TODCAuto-generated method stubsecurityDoor.open();public void open()System. out .println(" 安全門開啟");importpublic class Thermosensor private ArrayList<AlarmListener> alarm;public void attach(AlarmListener listener) alarm.add(listener);public void detach(AlarmListener listener) alarm

32、.remove(listener);public void notifyAlarm()for (Object obj : alarm)(AlarmListener)obj).response();#.類圖:實現(xiàn)代碼:public interface Discount public double calculate( double price);public class CIPDiscount implements DiscountOverridepublic double calculate( double price) / TODCAuto-generated method stub System. out .println(" 增加積分!”); return price*0.5;public class MovieTicket private double price;private Discount discount;public double getPrice() return discount.calculate(price);public Discount getDiscount() re

溫馨提示

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

最新文檔

評論

0/150

提交評論