面向?qū)ο笙到y(tǒng)分析和設(shè)計(jì)綜合實(shí)驗(yàn)報(bào)告4_第1頁
面向?qū)ο笙到y(tǒng)分析和設(shè)計(jì)綜合實(shí)驗(yàn)報(bào)告4_第2頁
面向?qū)ο笙到y(tǒng)分析和設(shè)計(jì)綜合實(shí)驗(yàn)報(bào)告4_第3頁
面向?qū)ο笙到y(tǒng)分析和設(shè)計(jì)綜合實(shí)驗(yàn)報(bào)告4_第4頁
面向?qū)ο笙到y(tǒng)分析和設(shè)計(jì)綜合實(shí)驗(yàn)報(bào)告4_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)名稱:實(shí)驗(yàn)4 設(shè)計(jì)模型實(shí)驗(yàn)2學(xué)期: 2017-2018 學(xué)年第二學(xué)期一、實(shí)驗(yàn)?zāi)康?熟練使用面向?qū)ο笤O(shè)計(jì)原則對(duì)系統(tǒng)進(jìn)行重構(gòu);2熟練使用面向?qū)ο缶幊陶Z言(JAVA或 C+)實(shí)現(xiàn)幾種常見的設(shè)計(jì)模式,包括單例模式、策略模式、裝飾模式和適配器模式,理解每一種設(shè)計(jì)模式的模式動(dòng)機(jī),掌握模式結(jié)構(gòu),學(xué)習(xí)如何使用代碼實(shí)現(xiàn)這些模式。二、實(shí)驗(yàn)要求1. 選擇合適的面向?qū)ο笤O(shè)計(jì)原則對(duì)系統(tǒng)進(jìn)行重構(gòu),正確無誤地繪制重構(gòu)之后的類圖;2. 結(jié)合實(shí)例,正確無誤地繪制單例模式、策略模式、裝飾模式和適配器模式的結(jié)構(gòu)圖;3. 實(shí)現(xiàn)單例模式、策略模式、裝飾模式和適配器模式,代碼運(yùn)行正確無誤。三、實(shí)驗(yàn)內(nèi)容1. 現(xiàn)實(shí)生活中,居民身份證號(hào)碼

2、具有唯一性,同一個(gè)人不允許有多個(gè)身份證號(hào)碼,第一次申請(qǐng)身份證時(shí)將號(hào)碼分配給居民, 如果之后因?yàn)檫z失等原因補(bǔ)辦時(shí), 還是使用原來的身份證號(hào)碼,不會(huì)產(chǎn)生新號(hào)碼,現(xiàn)使用單例模式模擬該場景。1) 類圖2) 實(shí)現(xiàn)代碼:publicclassIdClient publicstaticvoidmain(Stringargs ) IdentityCardNo.getInstance();IdentityCardNo.getInstance();packageRefactoring1;publicclassIdentityCardNo privatestaticIdentityCardNoinstance;pr

3、ivateStringno;privateIdentityCardNo() publicstaticIdentityCardNo getInstance() if( instance=null) System.out .println(" 第一次辦理身份證,分配新號(hào)碼" );instance=new IdentityCardNo();instance.setNo("No6000654321");System.out .println(" 身份證號(hào)碼為:" +instance.getNo();elseSystem.out .printl

4、n(" 重復(fù)辦理身份證, 獲取舊號(hào)碼!" );returninstance;publicString getNo() returnno ;publicvoidsetNo(Stringno ) this. no =no;2. 每一麻將局都有兩個(gè)骰子,因此骰子就應(yīng)當(dāng)是雙例類?,F(xiàn)使用多例模式模擬該場景。1) 類圖2) 實(shí)現(xiàn)代碼:importimportpublicclassDice privatestaticDiceprivatestaticDiceprivateDice() die1=new Dice();die2=new Dice();publicstaticDice get

5、Instance(if( whichOne= 1) returndie1 ;elsereturndie2 ;intwhichOne ) publicsynchronizedintdice() Dated =new Date();Random r =new Random( d.getTime();intvalue=r .nextInt();value= Math.abs ( value );value=value% 6;value+= 1;returnvalue ;public class DiceClient private static Dice die1, die2;public stat

6、ic void main(String args) die1 = Dice.getInstance(1);die2 = Dice.getInstance(2);第一骰子骰出 : " + die1.dice();第二骰子骰出 : " + die2.dice();3. 某軟件公司為某電影院開發(fā)了一套影院售票系統(tǒng),在該系統(tǒng)中需要為不同類型的用戶提供不同的電影票 (MovieTicket) 打折 (Discount) 方式,具體打折方案如下:學(xué)生憑學(xué)生證可享受票價(jià)8 折優(yōu)惠;年齡在10 周歲及以下的兒童可享受每張票減免10 元的優(yōu)惠(原始票價(jià)需大于等于20 元);影院 VIP 用戶

7、除享受票價(jià)半價(jià)優(yōu)惠外還可進(jìn)行積分,影院贈(zèng)送的獎(jiǎng)品。該系統(tǒng)在將來可能還要根據(jù)需要引入新的打折方式。試使用策略模式設(shè)計(jì)并編程模擬實(shí)現(xiàn)該影院售票系統(tǒng)。1) 類圖積分累計(jì)到一定額度可換取電2) 實(shí)現(xiàn)代碼:publicinterfaceDiscount publicdoublecalculate(doubleprice);publicclassMovieTicket privatedoubleprice;privateDiscountdiscount;publicvoidsetPrice(doublethis. price=price;/ 維持一個(gè)對(duì)抽象折扣類的引用price) / 注入一個(gè)折扣類對(duì)象p

8、ublicvoidsetDiscount(Discountdiscount) this. discount=discount;publicdoublegetPrice() / 調(diào)用折扣類的折扣價(jià)計(jì)算方法returndiscount.calculate(this. price);/VIP會(huì)員票折扣類:具體策略類publicclassVIPDiscountimplementsDiscount publicdoublecalculate(doubleprice) System.out .println("VIP票: " );System.out .println(" 增

9、加積分! " );returnprice* 0.5;/ 學(xué)生票折扣類:具體策略類publicclassStudentDiscountpublicdoublecalculate(System.out .println(returnprice* 0.8;implementsdoubleprice" 學(xué)生票: " );Discount ) / 兒童票折扣類:具體策略類publicclassChildrenDiscountimplementsDiscount publicdoublecalculate(doubleprice) System.out .println(&q

10、uot; 兒童票: " );returnprice- 10;publicclassMoviceClient publicstaticvoidmain(Stringargs ) MovieTicketmt =new MovieTicket();doubleoriginalPrice= 60.0;doublecurrentPrice;mt.setPrice(originalPrice);System.out .println(" 原始價(jià)為: " +originalPriceSystem.out .println("-"););Discountdis

11、count= new VIPDiscount();/vip用戶mt.setDiscount(discount ); /注入折扣對(duì)象currentPrice=mt.getPrice();System.out .println(" 折后價(jià)為: " +currentPrice);discount= new StudentDiscount();/ 學(xué)生用戶mt.setDiscount(discount ); /注入折扣對(duì)象currentPrice=mt.getPrice();System.out .println(" 折后價(jià)為: " +currentPrice)

12、;discount= new ChildrenDiscount();/ 兒童用戶mt.setDiscount(discount ); /注入折扣對(duì)象currentPrice=mt.getPrice();System.out .println(" 折后價(jià)為: " +currentPrice);3) 實(shí)現(xiàn)結(jié)果 :4. 某軟件公司欲開發(fā)一款飛機(jī)模擬系統(tǒng),該系統(tǒng)主要模擬不同種類飛機(jī)的飛行特征與起飛特征,需要模擬的飛機(jī)種類及其特征如表1 所示:表 1 飛機(jī)種類及特征一覽表飛機(jī)種類起飛特征飛行特征直升機(jī) (Helicopter)垂直起飛 (VerticalTakeOff)亞音速飛行 (

13、SubSonicFly)客機(jī) (AirPlane)長距離起飛 (LongDistanceTakeOff)亞音速飛行 (SubSonicFly)殲擊機(jī) (Fighter)長距離起飛 (LongDistanceTakeOff)超音速飛行 (SuperSonicFly)鷂式戰(zhàn)斗機(jī) (Harrier)垂直起飛 (VerticalTakeOff)超音速飛行 (SuperSonicFly)為將來能夠模擬更多種類的飛機(jī),試采用策略模式設(shè)計(jì)并模擬實(shí)現(xiàn)該飛機(jī)模擬系統(tǒng)。1) 類圖2) 實(shí)現(xiàn)代碼:publicclassplane privatestatestate; / 狀態(tài)publicvoidsettakeoff

14、Features(statetFeatures)this. state=tFeatures;publicvoidsetplanetype(Stringif ( type =" 直升機(jī) " )state=new Helicopter();elseif ( type = " 客機(jī) " )state=new AirPlane();type ) elseif ( type = " 殲擊機(jī) state =new Fighter();" )elseif ( type = " 鷂式戰(zhàn)斗機(jī) state =new Harrier();&quo

15、t; )elsestate=null;publicvoidtakeoff()state.takeOff();publicvoidfly()state.fly();publicclassAirPlaneimplementsstateOverridepublicString takeOff() System. out .println(" 長距離起飛return" 長距離起飛 " ;" );OverridepublicString fly() System. out .println(return" 亞音速飛行" ;" 亞音速飛

16、行" );publicclassFighterimplementsstateOverridepublicString takeOff() System. out .println(" 長距離起飛return" 長距離起飛 " ;" );OverridepublicString fly() System. out .println(return" 超音速飛行" ;" 超亞音速飛行" );publicclassHarrierimplements stateOverridepublicString takeOf

17、f() System.out .println(" 垂直起飛 " );return"垂直起飛 "OverridepublicString fly() System.out .println(" 超亞音速飛行 " );return" 超音速飛行 " ;publicclassHelicopterimplements stateOverridepublicString takeOff() System.out .println(" 垂直起飛 " );return"垂直起飛 "Ove

18、rridepublicString fly() System. out .println(" 亞音速飛行 " );return" 亞音速飛行 " ;publicinterfacestate publicString takeOff();/ 起飛publicString fly();/ 飛行publicclassClient publicstaticvoidmain(Stringargs ) planeplaneplaneplaneplane=new plane();.setplanetype(" 殲擊機(jī).takeoff();.fly();&qu

19、ot; );3) 實(shí)現(xiàn)結(jié)果:5. 兒子、媽媽、父親三人合作畫一幅畫,兒子負(fù)責(zé)畫出一朵花的輪廓,媽媽負(fù)責(zé)涂上顏色、父親負(fù)責(zé)將畫裱在畫框里?,F(xiàn)請(qǐng)使用裝飾模式模擬這個(gè)過程。1) 類圖2) 實(shí)現(xiàn)代碼:publicinterfacepainting publicString Draw();publicclassSonimplementspaintingOverridepublicString Draw() System. out .println(" 兒子用筆畫出了花的輪廓return" 兒子用筆畫出了花的輪廓" ;" );publicclass private

20、public thisFatherimplementspaintingpaintingFather(painting. painting= paintingpainting; / 被裝飾者painting) ;privatepublicFather() voidpaint() / 爸爸裝飾者做的職責(zé)System.out .println(" 爸爸正在做上畫框前的準(zhǔn)備工作painting.Draw();/爸爸裝飾者做職責(zé)System.out .println(" 父親將畫裱在畫框里" );OverridepublicString Draw() System. out

21、 .println(" 父親將畫裱在畫框里" );return" 父親將畫裱在畫框里" ;" );publicclassprivateMother paintingimplements paintingpainting; / 被裝飾者publicthisMother(painting. painting= paintingpainting;) privateMother() publicvoidpaint() System. out .println(" 媽媽正在做給畫上顏色前的準(zhǔn)備工作。painting.Draw();/ 媽媽裝飾者

22、做的職責(zé)System. out .println(" 媽媽給畫上好了顏色" );OverridepublicString Draw() System. out .println(" 媽媽給畫上好了顏色" );return" 媽媽給畫上好了顏色" ;" );publicclassClient publicstaticvoidmain(Stringpaintingpainting= new Son();painting.Draw();painting=new Mother(paintingpainting.Draw();pain

23、ting=new Father(paintingpainting.Draw();args ););3) 實(shí)現(xiàn)結(jié)果:6. 某公司想通過網(wǎng)絡(luò)傳輸數(shù)據(jù),但是擔(dān)心文件被竊取。他們的所有數(shù)據(jù)都采用字符的方式傳送。 現(xiàn)在他們開發(fā)了一個(gè)數(shù)據(jù)加密模塊,可以對(duì)字符串進(jìn)行加密, 以便數(shù)據(jù)更安全地傳送。最簡單的加密算法通過對(duì)字母向后移動(dòng)6 位來實(shí)現(xiàn), 同時(shí)還提供了稍復(fù)雜的逆向輸出加密,還提供了更為高級(jí)的求模加密,讓每一位與6 求模。用戶先使用最簡單的加密算法對(duì)字符串進(jìn)行加密,再對(duì)加密之后的結(jié)果使用復(fù)雜加密算法進(jìn)行二次加密, 再對(duì)二次加密結(jié)果用高級(jí)加密算法進(jìn)行第三次加密。 現(xiàn)請(qǐng)使用裝飾模式模擬這個(gè)過程。1) 類圖2)

24、 實(shí)現(xiàn)代碼:publicclassConcreteEncryptimplementsEncryptComponetprivateEncryptComponetencryptComponet;publicConcreteEncrypt(EncryptComponetencryptComponetsuper ();this. encryptComponet=encryptComponet;) publicvoid encrypt() encryptComponet.encrypt();publicinterfaceEncryptComponet publicabstractvoidencrypt(

25、);publicclassRawDataimplementsEncryptComponetpublicvoidencrypt() System.out .println(" 這是要發(fā)送的數(shù)據(jù)" );publicclassReversEncryptimplementspublicReversEncrypt(EncryptComponetEncryptComponetencryptComponet) addReservesEncrypt();privateSystem.voidaddReservesEncrypt() out .println(" 反向加密"

26、 );Overridepublicvoidencrypt() public class SuperEncrypt implements public SuperEncrypt(EncryptComponetEncryptComponetencryptComponet) addSuperEncrypt();privateSystem.voidaddSuperEncrypt() out .println(" 最高加密算法" );Overridepublicvoidencrypt() public class TranslateEncrypt implements public

27、TranslateEncrypt(EncryptComponetEncryptComponetencryptComponet) addTranslateEncrypt();privateSystem.voidaddTranslateEncrypt() out .println(" 移動(dòng)加密 " );Overridepublicvoidencrypt() publicclass Client publicstaticvoidmain(Stringargs ) EncryptComponets0 , s1 , s2 , s3 ;s0=new RawData();s1=new T

28、ranslateEncrypt(s0 );s2=new ReversEncrypt(s1 );s3=new SuperEncrypt(s2 );s3 .encrypt();7. 現(xiàn)需要設(shè)計(jì)一個(gè)可以模擬各種動(dòng)物行為的機(jī)器人,在機(jī)器人中定義了一系列方法,如機(jī)器人叫喊方法cry()、機(jī)器人移動(dòng)方法move()等。如果希望在不修改已有代碼的基礎(chǔ)上使得機(jī)器人能夠像狗一樣叫,像狗一樣跑,使用適配器模式進(jìn)行系統(tǒng)設(shè)計(jì)。1)類圖2) 實(shí)現(xiàn)代碼public interface public void public voidRobot cry();move();publicclassDog publicvoidba

29、rks()System. out .println(" 狗在叫" );publicvoidrun()System. out .println(" 狗在跑" );publicclassDogadapterOverridepublicvoidcry() barks();extendsDogimplementsRobotOverridepublicvoidmove() run();publicclassClient publicstaticvoidmain(Stringargs ) Dogadapterdogrobot=new Dogadapter();dog

30、robot.move();dogrobot.cry();3) 實(shí)現(xiàn)結(jié)果8. 在 NBA 作為外籍中鋒,我需要翻譯,具體場景描述如下:姚明剛來到 NBA,身材夠高,球技?jí)蚝?;但是英語不是很懂,聽不懂教練的戰(zhàn)術(shù)安排;球員分為前鋒、中鋒和后衛(wèi);教練會(huì)給球員分配進(jìn)攻、防守任務(wù)?,F(xiàn)請(qǐng)使用適配器模式模擬這個(gè)場景。1) 類圖2) 實(shí)現(xiàn)代碼:publicabstractclassPlayerprotected String public Player(Stringname;name)this. name =name;publicpublicabstractabstractvoidattack();voidde

31、fense();publicclassGuardsextendsPlayerpublicGuards(Stringname)super ( name);publicvoidattack()System.out .println(" 后衛(wèi) " +name +" 進(jìn)攻 " );publicvoiddefense()System.out .println("后衛(wèi)" +name +" 防守" );publicclassCenterpublicCenter(StringextendsPlayername)super ( name);publicvoidattack()System.out .println(" 中鋒 " +name +" 進(jìn)攻 " )

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論