中南大學(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頁
免費預(yù)覽已結(jié)束,剩余18頁可下載查看

下載本文檔

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

文檔簡介

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

2、ly Chain 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、。3. 某軟件公司欲開發(fā)一個基于 Windows平臺的公告板系統(tǒng)。系統(tǒng)提供一個 主菜單 (Menu),在主菜單中包含了一些菜單項 (MenuItem) ,可以通過 Menu類的 addMenuItem() 方法增加菜單項。菜單項的主要方法是 click() ,每一個菜單項 包含一個抽象命令類,具體命令類包括 OpenComman打d(開命令 ) , CreateCommand新( 建命令 ) , EditCommand(編輯命令 )等,命令類具有一個 execute() 方法,用于調(diào)用公告板系統(tǒng)界面類 (BoardScreen) 的 open() 、 create() 、edit() 等方法。

4、現(xiàn)使用命令模式設(shè)計該系統(tǒng),使得 MenuItem 類與 BoardScreen 類的耦合度降低,繪制類圖并編程實現(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ā)出警報(

5、alarm() 、安全逃生門 (SecurityDoor) 將自動開啟 (open() 、隔熱門(InsulatedDoor) 將自動關(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)惠(原始票價

6、 需大于等于 20 元);(3) 影院 VIP 用戶除享受票價半價優(yōu)惠外還可進行積分, 積分累計到一定額 度可換取電影院贈送的獎品。該系統(tǒng)在將來可能還要根據(jù)需要引入新的打折方式。 試使用策略模式設(shè)計并編程模擬實現(xiàn)該影院售票系統(tǒng)。7. 為了實現(xiàn)一些特殊的顯示效果,某公司欲開發(fā)一款手機數(shù)碼照片處理軟 件,在該軟件中為照片 (Photograph) 提供了多種濾鏡 (Filter) 效果,例如黑白濾 鏡 (BlackWhiteFilter) 、 單 色 濾 鏡 (MonochromaticFilter) 、 懷 舊 濾 鏡 (NostalgicFilter) 等,不同的濾鏡通過不同的算法對照片進行美

7、化,如下圖所 示。該軟件可以靈活地增加一些新的濾鏡效果。選擇一種合適的設(shè)計模式來設(shè)計該照片處理軟件, 結(jié)合場景繪制相應(yīng)的類圖 并編程模擬實現(xiàn)。三、實驗要求1. 結(jié)合實例,正確無誤地繪制職責(zé)鏈模式、命令模式、觀察者模式和策略 模式的模式結(jié)構(gòu)圖;2. 使用任意一種面向?qū)ο缶幊陶Z言實現(xiàn)職責(zé)鏈模式、命令模式、觀察者模 式和策略模式實例,代碼運行正確無誤。四、實驗步驟1. 結(jié)合實例,使用 PowerDesigner 繪制職責(zé)鏈模式實例結(jié)構(gòu)圖并用面向?qū)?象編程語言實現(xiàn)該模式實例;2. 結(jié)合實例,使用 PowerDesigner 繪制命令模式實例結(jié)構(gòu)圖并用面向?qū)ο?編程語言實現(xiàn)該模式實例;3. 結(jié)合實例,使

8、用 PowerDesigner 繪制命令模式實例結(jié)構(gòu)圖并用面向?qū)ο?編程語言實現(xiàn)該模式實例;4. 結(jié)合實例,使用 PowerDesigner 繪制觀察者模式實例結(jié)構(gòu)圖并用面向?qū)?象編程語言實現(xiàn)該模式實例;5. 結(jié)合實例,使用 PowerDesigner 繪制觀察者模式實例結(jié)構(gòu)圖并用面向?qū)?象編程語言實現(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 P

9、urchaseRequest public double amount;public int number;public String purpose; public double getAmount() return amount;publicvoid setAmount( double amount) this.amount = amount;publicint getNumber() return number;public void setNumber( int number) this .number = number;public String getPurpose() retur

10、n purpose;public void setPurpose(String purpose) this .purpose = purpose;public class Approver protected Approver succesor;public Approver() succesor = null ;public void processRequest(PurchaseRequest aRequest) if (succesor!= null )cessRequest(aRequest);public void setSuccesor(Approver s

11、uccesor) this .succesor = succesor;public class Congress extends Approver public void processRequest(PurchaseRequest request) if (request.getAmount()>=500000)System. out .println(" 董事會 ");public class Director extends Approver public void processRequest(PurchaseRequest request)if (reque

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

13、lse if (this .succesor!= null )this .cessRequest(request);public class VicePresident extends Approverpublic void processRequest(PurchaseRequest request) if (request.getAmount()<100000)System. out .println(" 副董事長 ");else if (this .succesor!= null )this .cessReques

14、t(request);2. 類圖:實現(xiàn)代碼:public abstract class AbstractCommand public abstract void open();public abstract void close();public class Switch private AbstractCommand command;public void setCommand(AbstractCommand command) this .command = command;public void open()command.open();public void close()command

15、.close();public class Fun public void open()System. out .println(" 開風(fēng)扇 ");public void close()System. 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 FunCommande

16、 xtends AbstractCommand private Fun fun = new Fun();Overridepublic void open() / TODO Auto-generated method stub fun.open();Overridepublic void close() / TODO Auto-generated method stub fun.close();public class LightCommand extends AbstractCommand private Light light =new Light();Override public voi

17、d open() / TODO Auto-generated method stub light.open();Overridepublic void close() / TODO Auto-generated method stub light.close();3. 類圖:實現(xiàn)代碼:public interface Command publicvoid excute();public class MenuItem privateString name;privateCommand command;publicMenuItem(String name) = name;publ

18、icString getName() return name;public void setName(String name) this .name = name;public Command getCommand() return command;public void setCommand(Command command) this .command = command;public void click() command.excute();importpublic class Menu public ArrayList itemList =new ArrayList();public

19、void addMenuItem(MenuItem item) itemList.add(item);public class OpenCommandim plements Command private BoardScreen screen;public OpenCommand(BoardScreen screen) super ();this .screen = screen;Overridepublic void excute() / TODO Auto-generated method stub screen.open();public class CreateCommand impl

20、ements Command private BoardScreen screen;public CreateCommand(BoardScreen screen) super ();this .screen = screen;Overridepublic void excute() / TODO Auto-generated method stub screen.create();public class EidtCommand implements Command private BoardScreen screen;public EidtCommand(BoardScreen scree

21、n) super ();this .screen = screen;Overridepublic void excute() / TODO Auto-generated method stub screen.edit();public class BoardScreen private Menu menu;private MenuItem openItem,createItem,editItem; public BoardScreen()menu = new Menu();openItem = new MenuItem(" 打開 "); createItem = new M

22、enuItem(" 新建 "); editItem = new MenuItem(" 編輯 "); menu.addMenuItem(openItem); menu.addMenuItem(createItem);menu.addMenuItem(editItem);public void display()System. out .println(" 主菜單選項: "); for (Object obj : menu.itemList)System. out .println(MenuItem)obj).getName()publi

23、c void open()System. out .println("public void create()System. out .println("public void edit()System. out .println("public Menu getMenu() return menu;顯示打開窗口! ");顯示新建窗口! ");顯示編輯窗口! ");4. 類圖: 實現(xiàn)代碼:public interface Investor public void response(Stock stck);public class Co

24、ncreteInvestor implements Investor private String name;public ConcreteInvestor(String name) super ();this .name = name;Overridepublic void response(Stock stock) / TODO Auto-generated method stubSystem. out .println(name+": ");System. out .println(stock.getStockName()+"漲幅超過5%");Sy

25、stem. out .println(" 新價格 "+stock.getPrice();importpublic class Stock private ArrayList<Investor> investors;private String stockName;private double price;public Stock(String stockName, double price) super ();this .stockName = stockName;this .price = price;investors = new ArrayList<

26、Investor>();public void attach(Investor investor) investors.add(investor);public void detach(Investor investor) investors.remove(investor);public void notifyInvestor()for (Object obj : investors)(Investor)obj).response( this );public String getStockName() return stockName;public void setStockName

27、(String stockName) this .stockName = stockName;public double getPrice() return price;public void setPrice( double price) double range = Math. abs(price- this .price)/ this .price; this .price = price;if (range>=0.05)this .notifyInvestor();public class Client public static void main(String args) I

28、nvestor investor1,investor2;investor1 = new ConcreteInvestor(" 哈哈 ");investor2 = new ConcreteInvestor(" 呵呵 ");Stock haier = new Stock("haier", 20.00); haier.attach(investor1);haier.attach(investor2);haier.setPrice(25.00);5. 類圖:實現(xiàn)代碼:public interface AlarmListener public

29、void response();public class Annunciator implements AlarmListener private Annunciator annunciator;Overridepublic void response() / TODO Auto-generated method stub annunciator.alarm();public void alarm()System. out .println(" 報警器警報 ");public class CautionLight implements AlarmListener priva

30、te CautionLight light;Overridepublic void response() / TODO Auto-generated method stublight.flicker();public void flicker()System. out .println(" 警示燈閃爍 ");public class InsulatedDoor implements AlarmListener private InsulatedDoor insulatedDoor;Overridepublic void response() / TODO Auto-gene

31、rated method stub insulatedDoor.close();public void close()System. out .println(" 隔熱門關(guān)閉 ");public class SecurityDoor implements AlarmListener private SecurityDoor securityDoor;Overridepublic void response() / TODO Auto-generated method stubsecurityDoor.open();public void open()System. out

32、.println(" 安全門開啟 ");importpublic class Thermosensor private ArrayList<AlarmListener> alarm;public void attach(AlarmListener listener) alarm.add(listener);public void detach(AlarmListener listener) alarm.remove(listener);public void notifyAlarm()for (Object obj : alarm)(AlarmListener)

33、obj).response();6. 類圖: 實現(xiàn)代碼: public interface Discount public double calculate( double price);public class CIPDiscount implements DiscountOverridepublic double calculate( double price) / TODO Auto-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 ge

溫馨提示

  • 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

提交評論