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

下載本文檔

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

文檔簡介

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

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

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

4、n(" 重復辦理身份證, 獲取舊號碼!" );returninstance;publicString getNo() returnno ;publicvoidsetNo(Stringno ) this. no =no;2. 每一麻將局都有兩個骰子,因此骰子就應當是雙例類?,F(xiàn)使用多例模式模擬該場景。1) 類圖2) 實現(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) 方式,具體打折方案如下:學生憑學生證可享受票價8 折優(yōu)惠;年齡在10 周歲及以下的兒童可享受每張票減免10 元的優(yōu)惠(原始票價需大于等于20 元);影院 VIP 用戶

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

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

9、加積分! " );returnprice* 0.5;/ 學生票折扣類:具體策略類publicclassStudentDiscountpublicdoublecalculate(System.out .println(returnprice* 0.8;implementsdoubleprice" 學生票: " );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(" 原始價為: " +originalPriceSystem.out .println("-"););Discountdis

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

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

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

14、Features(statetFeatures)this. state=tFeatures;publicvoidsetplanetype(Stringif ( type =" 直升機 " )state=new Helicopter();elseif ( type = " 客機 " )state=new AirPlane();type ) elseif ( type = " 殲擊機 state =new Fighter();" )elseif ( type = " 鷂式戰(zhàn)斗機 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(" 殲擊機.takeoff();.fly();&qu

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

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

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

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

24、 實現(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(" 移動加密 " );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)需要設計一個可以模擬各種動物行為的機器人,在機器人中定義了一系列方法,如機器人叫喊方法cry()、機器人移動方法move()等。如果希望在不修改已有代碼的基礎(chǔ)上使得機器人能夠像狗一樣叫,像狗一樣跑,使用適配器模式進行系統(tǒng)設計。1)類圖2) 實現(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) 實現(xiàn)結(jié)果8. 在 NBA 作為外籍中鋒,我需要翻譯,具體場景描述如下:姚明剛來到 NBA,身材夠高,球技夠好;但是英語不是很懂,聽不懂教練的戰(zhàn)術(shù)安排;球員分為前鋒、中鋒和后衛(wèi);教練會給球員分配進攻、防守任務。現(xiàn)請使用適配器模式模擬這個場景。1) 類圖2) 實現(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 +" 進攻 " );publicvoiddefense()System.out .println("后衛(wèi)" +name +" 防守" );publicclassCenterpublicCenter(StringextendsPlayername)super ( name);publicvoidattack()System.out .println(" 中鋒 " +name +" 進攻 " )

溫馨提示

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

評論

0/150

提交評論