![軟件設(shè)計格式和體系結(jié)構(gòu)_第1頁](http://file4.renrendoc.com/view/f5f78f53bbfd2105f0db5927da20120c/f5f78f53bbfd2105f0db5927da20120c1.gif)
![軟件設(shè)計格式和體系結(jié)構(gòu)_第2頁](http://file4.renrendoc.com/view/f5f78f53bbfd2105f0db5927da20120c/f5f78f53bbfd2105f0db5927da20120c2.gif)
![軟件設(shè)計格式和體系結(jié)構(gòu)_第3頁](http://file4.renrendoc.com/view/f5f78f53bbfd2105f0db5927da20120c/f5f78f53bbfd2105f0db5927da20120c3.gif)
![軟件設(shè)計格式和體系結(jié)構(gòu)_第4頁](http://file4.renrendoc.com/view/f5f78f53bbfd2105f0db5927da20120c/f5f78f53bbfd2105f0db5927da20120c4.gif)
![軟件設(shè)計格式和體系結(jié)構(gòu)_第5頁](http://file4.renrendoc.com/view/f5f78f53bbfd2105f0db5927da20120c/f5f78f53bbfd2105f0db5927da20120c5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
...wd......wd......wd...計算機科學與技術(shù)學院《軟件設(shè)計模式與體系構(gòu)造》課程作業(yè)〔一〕〔2016/2017學年第二學期〕學生姓名:雷君學生專業(yè):軟件工程學生班級:142601學生學號:201426170108指導教師:王飛目錄TOC\o"1-2"\h\z\u實驗一1工廠方法模式——汽車保險1抽象工廠方法模式——房屋信息3實驗二6組合模式——空軍指揮系統(tǒng)6適配器模式——客戶信息驗證8實驗三11橋接模式——幾何立體體積11訪問者模式——計算機部件銷售軟件14實驗四17策略模式——整數(shù)排序17狀態(tài)模式——交通信號燈19實驗五21MVC軟件體系構(gòu)造21實驗一工廠方法模式——汽車保險【實驗內(nèi)容】在例2.3的汽車保險管理應用程序?qū)嵗咸砑右粋€名為LuxuryCarInsurance的類,并且,該類要與其他的類一樣能執(zhí)行相應的功能?!咎砑哟a】添加LuxuryCarInsurance類:publicclassLuxuryCarInsuranceimplementsAutoInsurance{privateStringdescription;publicStringgetInsuranceDescription(){ description="LuxuryCarInsurance:\n\nLuxuryCarInsurancecoveragepaysformedicalbills"+ "lostwages,rehabilitation,treatmentand/or"+ "funeralcostsforanyoneinjuredorkilled"+ "byyourcar.Suchcoveragewillalsopayfor"+ "painandsufferingdamageswhenathird"+ "partysuccessfullysues."; returndescription;}}添加LuxuryCarPolicyProducer類:publicclassLuxuryCarPolicyProducerimplementsPolicyProducer{publicAutoInsurancegetPolicyObj()//Fruitfactory(){returnnewLuxuryCarInsurance();}}添加GUI:〔1〕publicstaticfinalStringLUXURYCAR="LuxuryCarInsurance";〔2〕cmbInsuranceType.addItem(LUXURYCAR);〔3〕if(type.equals(LUXURYCAR)){ pp=newLuxuryCarPolicyProducer(); }【實驗結(jié)果】【實驗小結(jié)】使用工廠方法訪問并且初始化適宜的類的對象,簡化了應用程序,應用程序本身不再含有大量的條件語句判定何時選取哪個類。其次,工廠方法實現(xiàn)了一些特殊的某個類的機制,尤其是層次構(gòu)造不同的類需要不同的初始化方法的時候。抽象工廠方法模式——房屋信息【實驗內(nèi)容】在例2.4中設(shè)計并且實現(xiàn)了豪華〔Super〕和中等〔Medum〕別墅〔House〕和公寓〔Condo〕的查詢。要求在該設(shè)計的根基上,增加一個新的類SemiDetacher〔半獨立式樓宇〕,并且編寫代碼實現(xiàn)相應的查詢功能。【添加代碼】1、添加SemiDetacher類:publicinterfaceSemiDetacher{ publicStringgetSemiDetacherInfo(); publicStringgetSemiDetacherFeatures();}添加SuperSemiDetacher類:publicclassSuperSemiDetacherimplementsSemiDetacher{privateStringname;publicSuperSemiDetacher(StringcName) { name=cName; }publicStringgetSemiDetacherInfo() { return"superSemiDetacher.html"; } publicStringgetSemiDetacherFeatures() { return"SuperSemiDetacher"; }}3、添加MediumSemiDetacher類:publicclassMediumSemiDetacherimplementsSemiDetacher{ privateStringname; publicMediumSemiDetacher(StringcName) { name=cName; } publicStringgetSemiDetacherInfo() { return"MediumSemiDetacher.html"; } publicStringgetSemiDetacherFeatures() { return"MediumSemiDetacher"; }}添加BuildingFactory:publicabstractSemiDetachergetSemiDetacher();5、添加MediumBuildingFactory:publicSemiDetachergetSemiDetacher(){ returnnewMediumSemiDetacher("MediumSemiDetacher");}添加SuperBuildingFactory:publicSemiDetachergetSemiDetacher(){ returnnewSuperSemiDetacher("SuperSemiDetacher");}7、添加GUI:〔1〕publicstaticfinalStringSEMIDETACHER="SemiDetacher";〔2〕cmbHouseType.addItem(SEMIDETACHER);〔3〕if(type.equals(AbstractFactoryGUI.SEMIDETACHER)){ SemiDetachercd=bf.getSemiDetacher(); StringfileNm=cd.getSemiDetacherInfo(); putHouseInfoToScreen(fileNm);}【實驗結(jié)果】【實驗小結(jié)】當客戶對象要從一個相關(guān)的產(chǎn)品組中創(chuàng)立一個對象,而沒有必要知道到底要創(chuàng)立哪個對象時,可以使用抽象工廠模式。如果不使用抽象工廠模式,創(chuàng)立對象的條件語句將會出現(xiàn)在客戶程序的許多地方,程序的克維護性差。抽象工廠模式幫助程序員防止了以上所述的重復的、復雜的條件語句,提供必要的創(chuàng)立對象的接口。實驗二組合模式——空軍指揮系統(tǒng)【實驗內(nèi)容】在例3.3的設(shè)計中,添加一個空軍大隊〔Wing〕類,該類與Squadron、Group類是平行的,因此應該繼承了AirUnit類。該類的寫法與Squadron或者Group類是類似的,所不同的是一個Wing有216中類型的飛機。【添加代碼】添加Wing類:publicclassWingextendsAirUnit{publicstaticfinalStringFEATURES="AWingwith216aircrafts";Airforce[]fighters=newAirforce[162];Airforce[]bombers=newAirforce[18];Airforce[]transporters=newAirforce[18];Airforce[]eAircrafts=newAirforce[18];publicWing(){for(intk=0;k<162;k++){//need162fighters }for(intk=0;k<18;k++){//need18bombers }for(intk=0;k<18;k++){//need18transporters }for(intk=0;k<18;k++){//need18eAirplanes }}publicStringgetDescription(){ returnFEATURES;}publicStringfight(){ returnsuper.fight(); }}添加GUI:〔1〕privateString[]AirForceUnit={"SQUADRON","GROUP","WING"};〔2〕add(1,6,airCheckBox[13]);〔3〕elseif((m==13)&&(ckBoxStates[13]==SELECTED)){ unit=newWing(); airUnits.attach(unit); unitInfo=unit.getDescription(); }【實驗結(jié)果】【實驗小結(jié)】我們這樣來簡單的理解組合模式,組合模式就是把一些現(xiàn)有的對象或者元素,經(jīng)過組合后組成新的對象,新的對象提供內(nèi)部方法,可以讓我們很方便的完成這些元素或者內(nèi)部對象的訪問和操作。我們也可以把組合對象理解成一個容器,容器提供各種訪問其內(nèi)部對象或者元素的API,我們只需要使用這些方法就可以操作它了。適配器模式——客戶信息驗證【實驗內(nèi)容】關(guān)于例3.7的用于驗證客戶信息的離架產(chǎn)品類CusInfoValidation的功能擴展問題。要求使用適配器模式?!咎砑哟a】添加InformationAdapter:publicbooleanisValidEmailAddr(StringEmailAddr){ booleanisValid=true; inta=0; intb=0; Stringns=EmailAddr.trim(); StringnStr=ns.replaceAll("\\s{1,}",""); intlen=nStr.length();if((((nStr.charAt(0)>='A')&&(nStr.charAt(0)>='Z'))|| ((nStr.charAt(0)>='a')&&(nStr.charAt(0)>='z')))&&(len>=5)){ for(intm=0;m<len;m++){if((Character.isLetter(nStr.charAt(m))==true)&&(Character.isDigit(nStr.charAt(m))==true)){ isValid=false; } if(nStr.charAt(m)=='@'){ a++; } if(nStr.charAt(m)>='0'&&nStr.charAt(m)<='9'){ b++; } if((m==0)&&(Character.isLetter(nStr.charAt(m))==false)){ isValid=false; } } if(a!=1){ isValid=false; } if(b==0){ isValid=false; } returnisValid; } else{ returnfalse; } }添加CusInfoValidator:publicabstractbooleanisValidEmailAddr(StringEmailAddr);3、添加GUI:〔1〕privateJTextFieldtxtCustomerName,txtAddress,txtZip,txtCellPhone,txtSSN,txtEmailAddr;〔2〕privateJLabellblCustomerName,lblAddress,lblZip,lblCellphone,lblSSN,lblEmailAddr;〔3〕txtEmailAddr=newJTextField(20);〔4〕lblEmailAddr=newJLabel("EmailAddr:");〔5〕UIPanel.add(lblEmailAddr); UIPanel.add(txtEmailAddr);〔6〕gridbag.setConstraints(lblEmailAddr,gbc); gbc.gridx=1; gbc.gridy=5; gridbag.setConstraints(txtEmailAddr,gbc); gbc.gridx=0; gbc.gridy=6;〔7〕publicStringgetEmailAddr(){ returntxtEmailAddr.getText(); }〔8〕Stringemailaddr=getEmailAddr();〔9〕if(cusInfo.isValidEmailAddr(emailaddr)==false){dataTextArea.append("\nWrongformatofEmailAddr.");}else{dataTextArea.append("\nCorrectformatofEmailAddr.");}【實驗結(jié)果】【實驗小結(jié)】通過適配器,客戶端可以調(diào)用同一接口,因而對客戶端來說是透明的。這樣做更簡單、更直接、更緊湊;復用了現(xiàn)存的類,解決了現(xiàn)存類和復用環(huán)境要求不一致的問題;將目標類和適配者類解耦,通過引入一個適配器類重用現(xiàn)有的適配者類,而無需修改原有代碼;
一個對象適配器可以把多個不同的適配者類適配到同一個目標,也就是說,同一個適配器可以把適配者類和它的子類都適配到目標接口。對于對象適配器來說,更換適配器的實現(xiàn)過程比擬復雜。實驗三橋接模式——幾何立體體積【實驗內(nèi)容】在例3.14中的設(shè)計實驗層次類局部中,添加Ellipsoid〔橢球〕類,并且實現(xiàn)針對橢球體積的計算?!咎砑哟a】1、添加橢球類:publicclassEllipsoidimplementsGeoForm{ privatedoubleaRadius; privatedoublebRadius; privatedoublecRadius; publicEllipsoid(doubleaRadius,doublebRadius,doublecRadius){ this.aRadius=aRadius; this.bRadius=bRadius; this.cRadius=cRadius; } publicdoublecomputeVolume(){ doublevolume=1.3333333*3.1415926*aRadius*bRadius*cRadius; returnvolume; } }2、添加GUI:〔1〕privateJTextFieldtxtEllipsoidRadius_a;privateJTextFieldtxtEllipsoidRadius_b;privateJTextFieldtxtEllipsoidRadius_c;〔2〕publicstaticfinalStringELLIPSOID="Ellipsoid";〔3〕cmbGeoForm.addItem(ELLIPSOID);〔4〕elseif(selection.equals(ELLIPSOID)){ Stringa_radius=txtEllipsoidRadius_a.getText(); Stringb_radius=txtEllipsoidRadius_b.getText(); Stringc_radius=txtEllipsoidRadius_c.getText(); doublea=Double.valueOf(a_radius); doubleb=Double.valueOf(b_radius); doublec=Double.valueOf(c_radius); form=newEllipsoid(a,b,c); }〔5〕elseif(selection.equals(ELLIPSOID)) displayNewGUI(getTypePanel(ELLIPSOID));〔6〕elseif(type.equals(ELLIPSOID)){ JLabellblRadius_a=newJLabel("InputRadiusa"); JLabellblRadius_b=newJLabel("InputRadiusb"); JLabellblRadius_c=newJLabel("InputRadiusc"); txtEllipsoidRadius_a=newJTextField(8); txtEllipsoidRadius_b=newJTextField(8); txtEllipsoidRadius_c=newJTextField(8); GridBagLayoutgridbag=newGridBagLayout(); typePanel.setLayout(gridbag); GridBagConstraintsgbc=newGridBagConstraints(); typePanel.add(lblRadius_a); typePanel.add(lblRadius_b); typePanel.add(lblRadius_c); typePanel.add(txtEllipsoidRadius_a); typePanel.add(txtEllipsoidRadius_b); typePanel.add(txtEllipsoidRadius_c); typePanel.add(lblMeasure);typePanel.add(cmbMeasure); gbc.insets.top=5; gbc.insets.bottom=5; gbc.insets.left=1; gbc.insets.right=8; gbc.anchor=GridBagConstraints.WEST; gbc.gridx=0; gbc.gridy=0;gridbag.setConstraints(lblRadius_a,gbc);gbc.gridx=1; gbc.gridy=0;gridbag.setConstraints(txtEllipsoidRadius_a,gbc);gbc.gridx=0; gbc.gridy=1;gridbag.setConstraints(lblRadius_b,gbc);gbc.gridx=1; gbc.gridy=1;gridbag.setConstraints(txtEllipsoidRadius_b,gbc);gbc.gridx=0; gbc.gridy=2; gridbag.setConstraints(lblRadius_c,gbc); gbc.gridx=1; gbc.gridy=2;gridbag.setConstraints(txtEllipsoidRadius_c,gbc);gbc.gridx=0; gbc.gridy=3;gridbag.setConstraints(lblMeasure,gbc);gbc.gridx=1; gbc.gridy=3;gridbag.setConstraints(cmbMeasure,gbc); }【實驗結(jié)果】【實驗小結(jié)】通過這次實驗我們大概理解了橋接模式,通過關(guān)聯(lián)“抽象層次類〞與“具體層次類〞這一橋梁,將表示兩個維度的層類〔數(shù)據(jù)構(gòu)造〕粘貼在一起,形成更大的數(shù)據(jù)構(gòu)造,而這種變化又不會對現(xiàn)有的類產(chǎn)生影響,這種思路的終極想法是將軟件設(shè)計的抽象局部與實現(xiàn)局部別離,使它們都可以獨立的變化。訪問者模式——計算機部件銷售軟件【實驗內(nèi)容】在例4.5的設(shè)計中添加一個類SoundBox。該類實現(xiàn)接口ComputerParts,并且其他的計算機部件的類的構(gòu)造類似?!咎砑哟a】1、添加SoundBox類:publicclassSoundBoximplementsComputerParts{publicstaticfinalStringNAME="SoundBox"; privatefinaldoublePRICE=127.00; publicstaticfinalStringFEATURES="SoundBox.X3K"; publicStringgetName(){ returnNAME; } publicdoublegetPrice(){returnPRICE;}publicStringgetDescription(){ returnFEATURES; } publicvoidaccept(Visitorv){System.out.println("SoundBoxhasbeenvisited.");v.visitSoundBox(this);}}添加GUI:〔1〕String[]compParts={"Case","Motherboard","Microprocessor","Memory","DriveController","VideoCard","Fan","PowerSupply","HardDiskDrive","CDDrive","DVDDevice","Monitor","Keyboard","Mouse","SoundBox","Assembly","WholePC"};〔2〕for(intk=11;k<17;k++)add(0,k,cParts[k]);〔3〕elseif(source==cParts[14]) states[14]=state; elseif(source==cParts[15]){ if(state==SELECTED){ cParts[1].setSelected(true); cParts[8].setSelected(true); } elseif(state==DESELECTED){ cParts[1].setSelected(false); cParts[8].setSelected(false); } states[15]=state; } elseif(source==cParts[16]){ if(state==SELECTED){ cParts[0].setSelected(true); for(intk=11;k<15;k++) cParts[k].setSelected(true); } elseif(state==DESELECTED){ cParts[0].setSelected(false); for(intk=11;k<15;k++) cParts[k].setSelected(false); } states[16]=state; }〔4〕elseif((m==14)&&(states[14]==SELECTED)){ part=newSoundBox(); msg.add("SoundBox"); }3、添加Visitor:publicabstractvoidvisitSoundBox(SoundBoxe);添加PriceVisitor:publicvoidvisitSoundBox(SoundBoxe){ price=e.getPrice(); partsPrices.add(newDouble(price)); total+=price;}5、添加PartsInfoVisitor:publicvoidvisitSoundBox(SoundBoxe){ partInfo=e.getDescription(); allOders=allOders+"\n"+partInfo; }【實驗結(jié)果】【實驗小結(jié)】通過此次實驗讓我們更加深刻的理解了訪問者模式,它在處理數(shù)據(jù)構(gòu)造較穩(wěn)定,但是作用于其上的操作需要經(jīng)常變化的問題時時非常有效的,因此可以在不改變該構(gòu)造體中的類的根基上定義一個新的操作,這個實驗就是如此,我們只需要添加新的類,然后調(diào)用accept(pv)方法就可以。實驗四策略模式——整數(shù)排序【實驗內(nèi)容】在例4.13的設(shè)計中的排序策略局部,添加一個類BidirectionaBubbleSort,進展“雙向冒泡法排序〞,以便擴展該排序系統(tǒng)的功能。為了實現(xiàn)擴展功能,需要相應地修改Context類與客戶圖形界面類StrategyGUI。【添加代碼】添加BidirBubbleSort類:publicclassBidirBubbleSortimplementsSortAlgorithm{publicint[]sort(int[]nums,Contextct){ct.startExecution();intj;intlimit=nums.length;intst=-1;while(st<limit){booleanflipped=false;st++;limit--;for(j=st;j<limit;j++){if(nums[j]>nums[j+1]){intT=nums[j];nums[j]=nums[j+1];nums[j+1]=T;flipped=true;}}if(!flipped){ct.endExecution();returnnums;}for(j=limit;--j>=st;){if(nums[j]>nums[j+1]){intT=nums[j];nums[j]=nums[j+1];nums[j+1]=T;flipped=true;}}if(!flipped){ ct.endExecution();returnnums;}}ct.endExecution();returnnums;}}添加GUI:〔1〕publicstaticfinalStringBidirBubble="BidirBubbleSort";〔2〕cmbAlgorithm.addItem(BidirBubble);〔3〕if(type.equals(BidirBubble)){ sa=newBidirBubbleSort(); }【實驗結(jié)果】【實驗小結(jié)】通過此次實驗讓我們更加理解了策略模式的優(yōu)勢,實現(xiàn)
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 條形碼、電子標簽等物聯(lián)網(wǎng)技術(shù)在文檔管理中的應用
- 2025年福建省職教高考《職測》核心考點必刷必練試題庫(含答案)
- 2025年楊凌職業(yè)技術(shù)學院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 中國銀行個人借款合同
- 正規(guī)的借款合同范本
- 航空運輸人才培養(yǎng)與行業(yè)發(fā)展
- 事業(yè)單位的試用期勞動合同范本
- 鋼筋單項勞務(wù)承包合同
- 臨設(shè)建設(shè)工程施工勞務(wù)分包合同
- 消防產(chǎn)品的買賣合同
- (二模)遵義市2025屆高三年級第二次適應性考試試卷 地理試卷(含答案)
- 二零二五隱名股東合作協(xié)議書及公司股權(quán)代持及回購協(xié)議
- 2025年計算機二級WPS考試題目
- 高管績效考核全案
- 2024年上海市中考英語試題和答案
- 教育部《中小學校園食品安全和膳食經(jīng)費管理工作指引》知識培訓
- 長沙醫(yī)學院《無機化學》2021-2022學年第一學期期末試卷
- 初一到初三英語單詞表2182個帶音標打印版
- 《人力資源管理》全套教學課件
- 年度重點工作計劃
- 2023年11月英語二級筆譯真題及答案(筆譯實務(wù))
評論
0/150
提交評論