軟件設計模式與體系結構_第1頁
軟件設計模式與體系結構_第2頁
軟件設計模式與體系結構_第3頁
軟件設計模式與體系結構_第4頁
軟件設計模式與體系結構_第5頁
已閱讀5頁,還剩20頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 計算機科學與技術學院軟件設計模式與體系結構課程作業(一) (2016/2017學年 第二學期)學生姓名: 雷 君學生專業: 軟件工程學生班級: 142601學生學號: 201426170108指導教師: 王 飛 目 錄實驗一1工廠方法模式汽車保險1抽象工廠方法模式房屋信息3實驗二6組合模式空軍指揮系統6適配器模式客戶信息驗證8實驗三11橋接模式幾何立體體積11訪問者模式計算機部件銷售軟件14實驗四17策略模式整數排序17狀態模式交通信號燈19實驗五21MVC軟件體系結構21實驗一工廠方法模式汽車保險【實驗內容】 在例2.3的汽車保險管理應用程序實例上添加一個名為LuxuryCarInsura

2、nce的類,并且,該類要與其他的類一樣能執行相應的功能?!咎砑哟a】1、 添加LuxuryCarInsurance類: public class LuxuryCarInsurance implements AutoInsurance private String description; public String getInsuranceDescription() description = " LuxuryCarInsurance: nnLuxuryCarInsurance coverage pays for medical bills" + " lost w

3、ages, rehabilitation, treatment and/or" + " funeral costs for anyone injured or killed " + " by your car. Such coverage will also pay for" + " pain and suffering damages when a third " + " party successfully sues. " return description; 2、 添加LuxuryCarPolic

4、yProducer類: public class LuxuryCarPolicyProducer implements PolicyProducer public AutoInsurance getPolicyObj() /Fruit factory() return new LuxuryCarInsurance(); 3、 添加GUI: (1)public static final String LUXURYCAR = "LuxuryCar Insurance" (2)cmbInsuranceType.addItem(LUXURYCAR); (3)if (type.equ

5、als(LUXURYCAR) pp=new LuxuryCarPolicyProducer(); 【實驗結果】 【實驗小結】使用工廠方法訪問并且初始化合適的類的對象,簡化了應用程序,應用程序本身不再含有大量的條件語句判定何時選取哪個類。其次,工廠方法實現了一些特殊的某個類的機制,尤其是層次結構不同的類需要不同的初始化方法的時候。抽象工廠方法模式房屋信息【實驗內容】 在例2.4中設計并且實現了豪華(Super)和中等(Medum)別墅(House)和公寓(Condo)的查詢。要求在該設計的基礎上,增加一個新的類SemiDetacher(半獨立式樓宇),并且編寫代碼實現相應的查詢功能?!咎砑哟a】

6、1、添加SemiDetacher類: public interface SemiDetacher public String getSemiDetacherInfo(); public String getSemiDetacherFeatures(); 2、 添加SuperSemiDetacher類: public class SuperSemiDetacher implements SemiDetacher private String name; public SuperSemiDetacher(String cName) name = cName; public String getSe

7、miDetacherInfo() return "superSemiDetacher.html" public String getSemiDetacherFeatures() return "Super SemiDetacher " 3、添加MediumSemiDetacher類: public class MediumSemiDetacher implements SemiDetacher private String name; public MediumSemiDetacher(String cName) name = cName; public

8、 String getSemiDetacherInfo() return "MediumSemiDetacher.html" public String getSemiDetacherFeatures()return "Medium SemiDetacher " 4、 添加BuildingFactory: public abstract SemiDetacher getSemiDetacher();5、添加MediumBuildingFactory: public SemiDetacher getSemiDetacher() return new Med

9、iumSemiDetacher("Medium SemiDetacher"); 6、 添加SuperBuildingFactory: public SemiDetacher getSemiDetacher() return new SuperSemiDetacher("Super SemiDetacher"); 7、添加GUI: (1)public static final String SEMIDETACHER = "SemiDetacher" (2)cmbHouseType.addItem(SEMIDETACHER); (3)if

10、 (type.equals(AbstractFactoryGUI.SEMIDETACHER) SemiDetacher cd = bf.getSemiDetacher(); String fileNm = cd.getSemiDetacherInfo(); putHouseInfoToScreen(fileNm); 【實驗結果】 【實驗小結】 當客戶對象要從一個相關的產品組中創建一個對象,而沒有必要知道到底要創建哪個對象時,可以使用抽象工廠模式。如果不使用抽象工廠模式,創建對象的條件語句將會出現在客戶程序的許多地方,程序的克維護性差。抽象工廠模式幫助程序員避免了以上所述的重復的、復雜的條件語句

11、,提供必要的創建對象的接口。實驗二組合模式空軍指揮系統【實驗內容】 在例3.3的設計中,添加一個空軍大隊(Wing)類,該類與Squadron、Group類是平行的,因此應該繼承了AirUnit類。該類的寫法與Squadron或者Group類是類似的,所不同的是一個Wing有216中類型的飛機?!咎砑哟a】1、 添加Wing類: public class Wing extends AirUnit public static final String FEATURES = "A Wing with 216 aircrafts" Airforce fighters = new

12、Airforce162; Airforce bombers = new Airforce18; Airforce transporters= new Airforce18; Airforce eAircrafts = new Airforce18; public Wing() for(int k=0;k<162;k+) / need 162 fighters for(int k=0;k<18;k+) / need 18 bombers for(int k=0;k<18;k+) / need 18 transporters for(int k=0;k<18;k+) / n

13、eed 18 eAirplanes public String getDescription() return FEATURES; public String fight() return super.fight(); 2、 添加GUI: (1)private String AirForceUnit = "SQUADRON", "GROUP", "WING" (2)add(1, 6, airCheckBox13); (3)else if (m=13) && (ckBoxStates13 = SELECTED) unit

14、 = new Wing(); airUnits.attach(unit); unitInfo = unit.getDescription(); 【實驗結果】 【實驗小結】 我們這樣來簡單的理解組合模式,組合模式就是把一些現有的對象或者元素,經過組合后組成新的對象,新的對象提供內部方法,可以讓我們很方便的完成這些元素或者內部對象的訪問和操作。我們也可以把組合對象理解成一個容器,容器提供各種訪問其內部對象或者元素的API,我們只需要使用這些方法就可以操作它了。適配器模式客戶信息驗證【實驗內容】 關于例3.7的用于驗證客戶信息的離架產品類CusInfo Validation的功能擴展問題。要求使用適

15、配器模式?!咎砑哟a】1、 添加InformationAdapter: public boolean isValidEmailAddr(String EmailAddr) boolean isValid=true; int a=0; int b=0; String ns = EmailAddr.trim(); String nStr = ns.replaceAll("s1,", ""); int len = nStr.length(); if ( (nStr.charAt(0) >='A')&&(nStr.charA

16、t(0) >='Z')| (nStr.charAt(0) >='a')&&(nStr.charAt(0) >='z') && (len>=5) ) for(int m=0; m<len; m+) if( (Character.isLetter(nStr.charAt(m)=true)&& ( Character.isDigit(nStr.charAt(m)=true) ) isValid=false; if(nStr.charAt(m)='') a+;

17、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; return isValid; else return false; 2、 添加CusInfoValidator: public abstract boolean isValidEmailAddr(S

18、tring EmailAddr);3、添加GUI: (1)private JTextField txtCustomerName, txtAddress,txtZip,txtCellPhone,txtSSN,txtEmailAddr; (2)private JLabel lblCustomerName, lblAddress,lblZip, lblCellphone, lblSSN, lblEmailAddr; (3)txtEmailAddr=new JTextField(20); (4)lblEmailAddr= new JLabel("EmailAddr :"); (5)

19、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)public String getEmailAddr() return txtEmailAddr.getText(); (8)String emailaddr = getEmailAddr

20、(); (9)if(cusInfo.isValidEmailAddr(emailaddr)=false) dataTextArea.append("nWrong format of EmailAddr."); else dataTextArea.append("nCorrect format of EmailAddr."); 【實驗結果】 【實驗小結】 通過適配器,客戶端可以調用同一接口,因而對客戶端來說是透明的。這樣做更簡單、更直接、更緊湊;復用了現存的類,解決了現存類和復用環境要求不一致的問題;將目標類和適配者類解耦,通過引入一個適配器類重用現有的適

21、配者類,而無需修改原有代碼; 一個對象適配器可以把多個不同的適配者類適配到同一個目標,也就是說,同一個適配器可以把適配者類和它的子類都適配到目標接口。對于對象適配器來說,更換適配器的實現過程比較復雜。實驗三橋接模式幾何立體體積【實驗內容】在例3.14中的設計實驗層次類部分中,添加Ellipsoid(橢球)類,并且實現針對橢球體積的計算?!咎砑哟a】1、添加橢球類: public class Ellipsoid implements GeoForm private double aRadius; private double bRadius; private double cRadiu

22、s; public Ellipsoid (double aRadius, double bRadius, double cRadius) this.aRadius = aRadius; this.bRadius = bRadius; this.cRadius = cRadius; public double computeVolume() double volume = 1.3333333*3.1415926* aRadius* bRadius* cRadius; return volume; 2、添加GUI:(1)private JTextField txtEllipsoidRadius_a

23、; private JTextField txtEllipsoidRadius_b; private JTextField txtEllipsoidRadius_c; (2)public static final String ELLIPSOID = "Ellipsoid"(3)cmbGeoForm.addItem(ELLIPSOID);(4)else if(selection.equals(ELLIPSOID) ) String a_radius = txtEllipsoidRadius_a.getText(); String b_radius = txtEllipsoi

24、dRadius_b.getText(); String c_radius = txtEllipsoidRadius_c.getText(); double a = Double.valueOf(a_radius); double b =Double.valueOf(b_radius); double c = Double.valueOf(c_radius); form = new Ellipsoid(a, b, c);(5)else if(selection.equals(ELLIPSOID) ) displayNewGUI( getTypePanel(ELLIPSOID);(6)else i

25、f(type.equals(ELLIPSOID) JLabel lblRadius_a = new JLabel("Input Radius a"); JLabel lblRadius_b = new JLabel("Input Radius b"); JLabel lblRadius_c = new JLabel("Input Radius c"); txtEllipsoidRadius_a = new JTextField(8); txtEllipsoidRadius_b = new JTextField(8); txtEllip

26、soidRadius_c = new JTextField(8); GridBagLayout gridbag = new GridBagLayout(); typePanel.setLayout(gridbag); GridBagConstraints gbc = new GridBagConstraints(); typePanel.add(lblRadius_a); typePanel.add(lblRadius_b); typePanel.add(lblRadius_c); typePanel.add(txtEllipsoidRadius_a); typePanel.add(txtEl

27、lipsoidRadius_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, g

28、bc); 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(lblRadiu

29、s_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); 【實驗結果】【實驗小結】 通過這次實驗我們大概理解了橋接模式,通過關聯“抽象層次類”與“具體層次類”這一橋梁,將表示兩個維度的層類(

30、數據結構)粘貼在一起,形成更大的數據結構,而這種變化又不會對現有的類產生影響,這種思路的終極想法是將軟件設計的抽象部分與實現部分分離,使它們都可以獨立的變化。訪問者模式計算機部件銷售軟件【實驗內容】 在例4.5的設計中添加一個類SoundBox。該類實現接口ComputerParts,并且其他的計算機部件的類的結構類似?!咎砑哟a】1、添加SoundBox類: public class SoundBox implements ComputerParts public static final String NAME = "SoundBox"private final dou

31、ble PRICE = 127.00;public static final String FEATURES = "SoundBox. X3K"public String getName()return NAME;public double getPrice() return PRICE; public String getDescription() return FEATURES;public void accept(Visitor v) System.out.println("SoundBox has been visited."); v.visit

32、SoundBox (this); 2、 添加GUI: (1)String compParts= "Case","Motherboard","Microprocessor","Memory", "DriveController","VideoCard","Fan","PowerSupply", "HardDiskDrive","CDDrive","DVDDevice","

33、;Monitor", "Keyboard","Mouse","SoundBox","Assembly","WholePC" (2)for(int k=11; k<17; k+) add(0, k, cPartsk); (3)else if (source = cParts14) states14 = state; else if (source = cParts15) if(state = SELECTED) cParts1.setSelected(true); cParts8.

34、setSelected(true); else if (state = DESELECTED) cParts1.setSelected(false); cParts8.setSelected(false); states15=state; else if (source = cParts16) if(state = SELECTED) cParts0.setSelected(true); for(int k=11; k<15; k+) cPartsk.setSelected(true); else if (state = DESELECTED) cParts0.setSelected(f

35、alse); for(int k=11; k<15; k+) cPartsk.setSelected(false); states16=state; (4)else if (m=14) && (states14 = SELECTED) part = new SoundBox(); msg.add("SoundBox"); 3、添加Visitor: public abstract void visitSoundBox (SoundBox e);4、 添加PriceVisitor: public void visitSoundBox (SoundBox e

36、)price = e.getPrice();partsPrices.add(new Double(price);total += price; 5、添加PartsInfoVisitor: public void visitSoundBox (SoundBox e)partInfo = e.getDescription();allOders = allOders + "n " + partInfo;【實驗結果】【實驗小結】 通過此次實驗讓我們更加深刻的理解了訪問者模式,它在處理數據結構較穩定,但是作用于其上的操作需要經常變化的問題時時非常有效的,因此可以在不改變該結構體中的類

37、的基礎上定義一個新的操作,這個實驗就是如此,我們只需要添加新的類,然后調用accept(pv)方法就可以。實驗四策略模式整數排序【實驗內容】在例4.13的設計中的排序策略部分,添加一個類BidirectionaBubbleSort,進行“雙向冒泡法排序”,以便擴展該排序系統的功能。為了實現擴展功能,需要相應地修改Context類與客戶圖形界面類StrategyGUI。【添加代碼】1、 添加BidirBubbleSort類: public class BidirBubbleSort implements SortAlgorithm public int sort(int nums,Context

38、 ct) ct.startExecution(); int j; int limit = nums.length; int st = -1; while(st < limit) boolean flipped = false; st+; limit-; for(j = st; j < limit; j+) if(numsj > numsj + 1) int T = numsj; numsj = numsj + 1; numsj + 1 = T; flipped = true; if(!flipped) ct.endExecution(); return nums; for(j

39、 = limit; -j >= st;) if(numsj > numsj + 1) int T = numsj; numsj = numsj + 1; numsj + 1 = T; flipped = true; if(!flipped) ct.endExecution(); return nums; ct.endExecution(); return nums; 2、 添加GUI: (1)public static final String BidirBubble= "BidirBubbleSort" (2)cmbAlgorithm.addItem(Bidi

40、rBubble); (3)if (type.equals(BidirBubble) sa = new BidirBubbleSort(); 【實驗結果】【實驗小結】 通過此次實驗讓我們更加理解了策略模式的優勢,實現了高內聚低耦合,它的應用場景是當有多個僅在行為上不同但是相關的類存在時,采用策略模式提供一個為一個類配置多種行為之一的方法。此時增加雙向冒泡排序法時,不需要修改Context類的代碼,只需要修改客戶類(StrategyGUI)。狀態模式交通信號燈【實驗內容】在例4.16的設計中的交通信號燈狀態部分,添加一個類BlueLight,進行紅綠黃藍紅的狀態變化,以便擴展該交通信號燈系統的狀態

溫馨提示

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

評論

0/150

提交評論