




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、軟件體系結構實驗報告項目名稱設計模式實驗一專業(yè)班級軟件1501學號姓名實驗成績:批閱教師:2017 年12月12日實驗2設計模式實驗一實驗學時:4每組人數(shù):1實驗類型:3(1 :基礎性2:綜合性3:設計性4 :研究性)實驗要求:1(1:必修2:選修3:其它)實驗類別:3(1:基礎2:專業(yè)基礎3:專業(yè)4:其它)、實驗目的1 熟練使用面向?qū)ο笤O計原則對系統(tǒng)進行重構;2. 熟練使用 PoWerDeSigner和任意一種面向?qū)ο缶幊陶Z言實現(xiàn)幾種常見的創(chuàng)建型設計 模式和結構型設計模式,包括簡單工廠模式、工廠方法模式、抽象工廠模式、單例模式、適 配器模式、橋接模式和組合模式,理解每一種設計模式的模式動機,
2、掌握模式結構,學習如 何使用代碼實現(xiàn)這些模式。、實驗內(nèi)容1 在某圖形庫 APl中提供了多種矢量圖模板,用戶可以基于這些矢量圖創(chuàng)建不同的顯示圖形,圖形庫設計人員設計的初始類圖如下所示:+ini t ():void+SetColor ():void+fill ():void+SetSiZe ():void+display ():voidCirCIeTrian gle+in it ():void+SetColor ():void+fill ():void+SetSiZe ():void+display ():Void+in it ():void+SetColor ():void+fill ():vo
3、id+SetSiZe ():void+display ():voidReCta ngleClie nt在該圖形庫中,每個圖形類(如 CirCIe、Triangle等)的init()方法用于初始化所創(chuàng)建的 圖形,setColor()方法用于給圖形設置邊框顏色,fill()方法用于給圖形設置填充顏色,SetSiZe() 方法用于設置圖形的大小,display()方法用于顯示圖形??蛻纛?Client)在使用該圖形庫時發(fā)現(xiàn)存在如下問題: 由于在創(chuàng)建窗口時每次只需要使用圖形庫中的一種圖形,因此在更換圖形時需要修 改客戶類源代碼; 在圖形庫中增加并使用新的圖形時需要修改客戶類源代碼; 客戶類在每次使用圖
4、形對象之前需要先創(chuàng)建圖形對象,有些圖形的創(chuàng)建過程較為復 雜,導致客戶類代碼冗長且難以維護?,F(xiàn)需要根據(jù)面向?qū)ο笤O計原則對該系統(tǒng)進行重構,要求如下: 隔離圖形的創(chuàng)建和使用,將圖形的創(chuàng)建過程封裝在專門的類中,客戶類在使用圖形時無須直接創(chuàng)建圖形對象,甚至不需要關心具體圖形類類名; 客戶類能夠方便地更換圖形或使用新增圖形,無須針對具體圖形類編程,符合開閉原則。繪制重構之后的類圖并說明在重構過程中所運用的面向?qū)ο笤O計原則。2. 在某RPG游戲中使用簡單工廠模式創(chuàng)建游戲角色,該游戲可根據(jù)用戶所選擇的參數(shù)來創(chuàng)建不同的角色(RoIe),例如參數(shù)為"an gel ”時創(chuàng)建一個天使角色,參數(shù)為"
5、hero ”時創(chuàng)建一個英雄角色,參數(shù)為"WitCh ”時創(chuàng)建一個女巫角色。繪制類圖并使用JaVa語言編程模擬實現(xiàn)。3. 現(xiàn)需要設計一個程序來讀取多種不同類型的圖片格式,針對每一種圖片格式都設計一個圖片讀取器(ImageReader),如GIF圖片讀取器(GifReader)用于讀取GIF格式的圖片、JPG 圖片讀取器(JPgReader)用于讀取JPG格式的圖片。圖片讀取器對象通過圖片讀取器工廠 ImageReaderFaCtOry來創(chuàng)建,ImageReaderFaCtOry是一個抽象類,用于定義創(chuàng)建圖片讀取器 的工廠方法,其子類GifReaderFaCtOry和JPgReaderF
6、aCtory用于創(chuàng)建具體的圖片讀取器對象。 使用工廠方法模式設計該程序,繪制類圖并編程模擬實現(xiàn)。需充分考慮系統(tǒng)的靈活性和可擴 展性。4. 某系統(tǒng)為了改進數(shù)據(jù)庫操作的性能,用戶可以自定義數(shù)據(jù)庫連接對象Connection和語句對象 Stateme nt,針對不同類型的數(shù)據(jù)庫提供不同的連接對象和語句對象,例如提供OraCIe或MySQL專用連接類和語句類,而且用戶可以通過配置文件等方式根據(jù)實際需要動 態(tài)更換系統(tǒng)數(shù)據(jù)庫。使用抽象工廠模式設計該系統(tǒng),要求繪制對應的類圖并使用JaVa語言編程模擬實現(xiàn)。5. 使用單例模式的思想實現(xiàn)多例模式(MUltitOn),確保系統(tǒng)中某個類的對象只能存在有限個,例如兩個
7、或三個,設計并編寫代碼實現(xiàn)一個多例類。6. 使用單例模式設計一個多文檔窗口(注:在 JaVa AWT/Swing開發(fā)中可使用 JDeSktOPPane和JlnternalFrame來實現(xiàn)),要求在主窗體中某個內(nèi)部子窗體只能實例化一次, 即只能彈出一個相同的子窗體,如下圖所示,編程實現(xiàn)該功能。子宙體Ef國竝擊t-I-內(nèi)都si體(注:用C#或C+實現(xiàn)類似功能也可以)7. 現(xiàn)有一個接口 DataoPeration 定義了排序方法 sort(int)和查找方法 SearCh(int, int),已知類 QUiCkSOrt的quickSort(int)方法實現(xiàn)了快速排序算法,類BinarySearch的
8、binarySearch(int, int)方法實現(xiàn)了二分查找算法。試使用適配器模式設計一個系統(tǒng),在不修 改源代碼的情況下將類 QUiCkSOrt和類BinarySearch的方法適配到 DataOPeratiOn接口中。繪 制類圖并編程實現(xiàn)。(要求實現(xiàn)快速排序和二分查找,使用對象適配器實現(xiàn))8. 空客(AirbUS)、波音(Boeing)和麥道(McDonnell-Douglas)都是飛機制造商,它們都生 產(chǎn)載客飛機(PaSSenger Plane和載貨飛機(Cargo Plane)?,F(xiàn)需要設計一個系統(tǒng),描述這些飛機 制造商以及它們所制造的飛機種類。繪制類圖并編程模擬實現(xiàn)。9. 某移動社交軟
9、件欲增加一個群組(GrOUP)功能。通過設置,用戶可以將自己的動態(tài)信息,包括最新動態(tài)、新上傳的視頻以及分享的鏈接等,分享給某個特定的成員(Member),也可以分享給某個群組中的所有成員;用戶可以將成員添加至某個指定的群組;此外,還允許用戶在一個群組中添加子群組,以便更加靈活地實現(xiàn)面向特定人群的信息共享。選擇一種合適的設計模式來設計該群組功能,要求給出該模式的名稱及定義,結合場景繪制相應的結構圖并編程模擬實現(xiàn)(類名、方法名和屬性名可自行定義)。10. 某教育機構組織結構如下圖所示:在該教育機構的 OA系統(tǒng)中可以給各級辦公室下發(fā)公文,試采用組合模式設計該機構的組織結構,繪制相應的類圖并編程模擬實
10、現(xiàn),在客戶端代碼中模擬下發(fā)公文。三、實驗要求1. 選擇合適的面向?qū)ο笤O計原則對系統(tǒng)進行重構,正確無誤地繪制重構之后的類圖;2. 結合實例,正確無誤地繪制簡單工廠模式、工廠方法模式、抽象工廠模式、單例模式、適配器模式、橋接模式和組合模式的模式結構圖;3. 使用任意一種面向?qū)ο缶幊陶Z言實現(xiàn)簡單工廠模式、工廠方法模式、抽象工廠模式、 單例模式、適配器模式、橋接模式和組合模式實例,代碼運行正確無誤。四、實驗步驟1. 選擇合適的面向?qū)ο笤O計原則對系統(tǒng)進行重構,使用PoWerDeSigner繪制重構之后的類圖;2. 結合實例,使用POWerDeSigner繪制簡單工廠模式實例結構圖并用面向?qū)ο缶幊陶Z言 實
11、現(xiàn)該模式實例;3. 結合實例,使用POWerDeSigner繪制工廠方法模式實例結構圖并用面向?qū)ο缶幊陶Z言 實現(xiàn)該模式實例;4. 結合實例,使用POWerDeSigner繪制抽象工廠模式實例結構圖并用面向?qū)ο缶幊陶Z言 實現(xiàn)該模式實例;5. 結合實例,使用POWerDeSigner繪制多例模式實例結構圖并用面向?qū)ο缶幊陶Z言實現(xiàn) 該模式實例;6. 結合實例,使用POWerDeSigner繪制單例模式實例結構圖并用面向?qū)ο缶幊陶Z言實現(xiàn) 該模式實例。7. 結合實例,使用POWerDeSigner繪制適配器模式實例結構圖并用面向?qū)ο缶幊陶Z言實 現(xiàn)該模式實例;8. 結合實例,使用POWerDeSigner
12、繪制橋接模式實例結構圖并用面向?qū)ο缶幊陶Z言實現(xiàn) 該模式實例;9. 結合實例,使用POWerDeSigner繪制組合模式實例結構圖并用面向?qū)ο缶幊陶Z言實現(xiàn) 該模式實例。五、實驗結果1.重構之后的類圖:Clf: l.tf .-:CFF-I-L- lA WLCCcr Q faL 0E «K>i» 0shl*Iraid:rHi:«!.:£:« C : 1E<L5 0: ZuViii veil*1:1 0CiiIC L Ii 沖血 o : vil"*I<下、Trik-CaCLJPLiir Q .LiIA3*! IJ . IeS
13、SlI重構過程中所使用的面向?qū)ο笤O計原則及簡要說明:根據(jù)題意采用了工廠方法模式,所謂工廠模式則是定義一個用于創(chuàng)建對象的接口,但是讓子類決定將哪一個類實例化。工廠方法模式讓一個類的實例化延遲到子類。使用了開閉原則,單一職責原則。2.類圖:¾ I f*弭丸"tfcQ> 3-tr3 tfpJ : BOlRAt4 <n5TMr?alfr ¢)display Q : *idT!i3trujcto>> fro 04L3play C) : *old.T d5pia Q:BidHTlAih<<truct>> KjtCh C)d3sp
14、lj 0 : Ld¥實現(xiàn)代碼:代碼顏色使用黑色,字體使用TimeS NeW Roman 或Arial,字號為五號,如Role 類:PUbIiC abstract class Role PUbIiC abstract void display();Angle 類:PUbliC class An gle exte nds Role PUbIiC An gle()PUbIiC void display()SyStem.out.pri ntln ("a ngle");Hero 類:PUbIiC class Hero exte nds Role PUbIiC Hero()P
15、UbIiC void display()SyStem.out.pri ntln ("hero");WitCh 類:PUbIiC class WitCh exte nds Role PUbIiCWitCh()PUbIiC void display()SyStem.out.pri ntl n("witch");RoleFaCtory 類:PUbliC class RoleFactory PUbIiC StatiC Role getRole(String type)Role role = nu II;if (type.equalslg no reCase(&q
16、uot;a ngle") role = new An gle();if (type.equalsIg no reCase("witch") role = new WitCh();if (type.equalsIg no reCase("Hero") role = new Hero();return role;Main類(客戶端):PUbliC class Mai n PUbliC StatiC Void main(String args) Role role;role= RoleFaCtory.getRole("hero")
17、;if (role=nu ll)SyStem.out.println("創(chuàng)建角色失敗請檢查參數(shù)");elserole.display();/SyStem.out.pri ntl n( "Hello World!");3.類圖:a <i-if?EaiK-:62ts住 0: viT ItIL *實現(xiàn)代碼:ImageReadeFaCtary 類:PUbliC abstract class ImageReaderFaCtOry PUbliC abstract ImageReader CreateImageReadeer();GifReaderFaCtOry
18、 類:PUbIiC class GifReaderFaCtOry exte nds ImageReaderFaCtOry PUbIiC ImageReader CreateImageReadeer() GifReader gifReader = new GifReader(); retur n gifReader;JPgReaderFaCtOry 類:PUbIiC class JPgReaderFaCtOry exte nds ImageReaderFaCtOry PUbIiC ImageReader CreateImageReadeer() JPgReader jpgReader = new
19、 JPgReader();retur n jpgReader;ImageReader 類:PUbIiC abstract class ImageReader PUbIiC void readImage()GifReader 類:PUbIiC class GifReader exte nds ImageReaderPUbIiC void readImage()SyStem.out.println("通過 GifReader 讀取圖片");JPgReader 類:PUbliC class JPgReader exte nds ImageReaderPUbIiC void rea
20、dImage()SyStem.out.println("通過 JPgReader讀取圖片");XMLUtil 類:import org.w3c.dom.Docume nt;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import javax.xml.parsers.Docume ntBuilder;import javax.xml.parsers.Docume ntBuilderFactory;import java.io.File;PUbIiC class XMLUtiI ZZ該方法用于從XML配置文件中提取具體
21、類類名,并返回一個實例對象PUbIiC StatiC ObjeCt getBea n() throws EXCePti On /創(chuàng)建DOM文檔對象DOCUme ntBuilderFactorydocume ntBuilderFactoryDOCUme ntBuilderFactory .newln Sta nce();DOCUme ntBuilderdocume ntBuilderdocume ntBuilderFactory .n ewDocume ntBuilder();DOCUme nt docume nt;document = documentBuilder.parse(new Fil
22、e("cOnfig.xml");/獲取包含類名的文本結點NOdeLiSt no deList = docume nt.getEleme ntsByTagName("imageType");Node imageTypeNode = no deList.item(0).getFirstChild();String imageType = imageTypeNode.getNodeV alue().trim();/通過類名生成實例對象并將其返回Class clazz = Class.forName(imageType+"ReaderFactory&q
23、uot;);ObjeCt ObjeCt = clazz .newln Sta nce();return object;Main類(客戶端):PUbliC class Mai n PUbliC StatiC Void main(String args) ImageReaderFaCtory imageReaderFactory = nu II;ImageReader imageReader;try imageReaderFactory = (ImageReaderFaCtOry)XMLUtil.getBea n(); CatCh (EXCePti On e) e.pri ntStackTrace
24、();imageReader = imageReaderFactory.createImageReadeer(); imageReader.readImage();4.類圖: 5aw*m3 -r d3baM,cMT0 MLUDI0 ¾ BtteS WfimertIQl ¾qCPclHEtaMJnani:Q sfftrEBJ vd0© h CWneCUOnuVd dA MHjEinHIq) VDhlCI h MtnrtDj 心G W ulr<5irlngJl Ked tFECaHorO CaIVfedkOn 5-< b CraJKSTaiBmflnilI
25、-S>.J I JIIii1 -CFDJ*> II丄I I<IJF-'*IiliI II a OrACIDFJCfcQrG, MqlFnmryi Ii vduConwccGConnDCrIarIGL muCkih3i(CCI<uwnSunQerbM*ISUWrMHCcr*aE實現(xiàn)代碼:扌由象工廠 databaseFactory類:PUbliC abstract class databaseFactory PUbIiC abstract Conn ecti On CreateC OnneCtion();PUbIiC abstract Stateme nt Crea
26、teStateme nt();具體工廠MySqIFaCtory類:PUbIiC class MySqIFaCtOry exte nds databaseFactory OVerridePUbIiC ConneCtion CreateC OnneCtion() return new mysqlC Onn ectio n();OVerridePUbIiC Stateme nt CreateStateme nt() return new mysqIStateme nt();具體工廠OraCleFaCtory類:PUbIiC class OraCIeFaCtOry exte nds databaseF
27、actory OVerridePUbIiC ConneCtion CreateC OnneCtion() retur n new OracIeC OnneCtion();OVerridePUbIiC Stateme nt CreateStateme nt() return new OracIeStateme nt();抽象產(chǎn)品ConnectiOn 類:PUbliC class ConneCtion PUbIiC void ConneCtion()抽象產(chǎn)品Statement類:PUbIiC class Stateme nt PUbIiC void Satteme nt()具體產(chǎn)品 mysqlCO
28、nneCtion 類:PUbIiC class mysqlC OnneCtion exte nds ConneCtion PUbIiC void connection。SyStem.out.println("提供 MySql 連接對象");具體產(chǎn)品 mysqIStatement類:PUbIiC class mysqIStateme nt exte nds Stateme ntPUbIiC void Satteme nt() SyStem.out.println("提供 mysql 語句對象");具體產(chǎn)品 oracIeCOnneCtion 類:PUbIiC
29、 class oracIeC OnneCtion exte nds ConneCtion PUbIiC void connection。SyStem.out.println("提供 oracle 連接對象");具體產(chǎn)品 OraCleStatement 類:PUbIiC class OracIeStateme nt exte nds Stateme nt PUbIiC Void Satteme nt() SyStem.out.println("提供 oracle 語句對象");工具類XMLUtiI :import org.w3c.dom.Docume nt
30、;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import javax.xml.parsers.Docume ntBuilder;import javax.xml.parsers.Docume ntBuilderFactory;import java.io.File;PUbIiC class XMLUtiI 該方法用于從XML配置文件中提取具體類類名,并返回一個實例對象PUbIiC StatiC ObjeCt getBea n() throws EXCePtiO n 創(chuàng)建DOM文檔對象DOCUme ntBuilderFactorydo
31、cume ntBuilderFactoryDOCUme ntBuilderFactory .newln Sta nce();DOCUme ntBuilderdocume ntBuilderdocume ntBuilderFactory .n ewDocume ntBuilder();DOCUme nt docume nt;docume nt = docume ntBuilder.parse( new File("c On fig.xml");獲取包含類名的文本結點NOdeLiSt no deList = docume nt.getEleme ntsByTagName(&qu
32、ot;databaseType");Node databaseTypeNode = no deList.item(O).getFirstChild();String databaseType = databaseTypeNode.getNodeVaIue().trim();/通過類名生成實例對象并將其返回Class clazz = CIass.forName(databaseType+"Factory");ObjeCt ObjeCt = clazz .newln Sta nce();return object;客戶端Main類:PUbIiC class Mai n
33、 PUbIiC StatiC void main(String args) databaseFactory daFactory = n ull;Conn ecti OnConneCtion ;Stateme nt Stateme nt;try daFactory = (databaseFactory)XMLUtil.getBea n(); CatCh (EXCePti On e) e.pri ntStackTrace();if (daFactory=nu ll)SyStem.out.println("未獲取到對象");else ConneCtion = daFactory.
34、createC OnneCtion();Stateme nt = daFactory.createStateme nt();ConneCtion.connection。;Stateme nt.satteme nt();5.類圖:實現(xiàn)代碼:單例類MUItitOn :PaCkage Sin glet on;import java.util.*;PUbIiC class MUItit On /兩個或者三個PriVate StatiC ArrayLiSt<Multiton> multitonLiSt = new ArrayLiSt<>();PriVate final Stati
35、C int NUMBER=3;PriVate MUltito n()PUbIiC StatiC MUItit On getI nsta nce() / TODO: impleme ntif (multito nList.size()<NUMBER)SyStem.out.println("創(chuàng)建新實例成功");MUItit On CUrre nt =new MUItit on();multit On List.add(curre nt);return CUrre nt;elseSyStem.out.println("不能創(chuàng)建更多的實例");retur
36、n multit On List.get (new Ran dom(). next In t(multit On List.size();客戶端類 Client :PaCkage Sin glet on;PUbIiC class Clie nt PUbIiC StatiC void main(String args) MUItiton m1 = MUItitOn.getInstance();MUItiton m2 = MUItiton.getInstance();MUItiton m3 = MUItiton.getInstance();MUItit On m4 = MUItito n.getl
37、 nsta nce();SyStem.out.pri ntln ("m1=m2:"+(m1=m2);SyStem.out.pri ntl n( "m2=m3:"+(m2=m4);SyStem.out.pri ntln ("m3=m4:"+(m3=m4);6運行結果:類圖:JIntemalFrameJFO I JlFlJinterrWiFrameIQJInteraIFrame 1 (Strtngr tx>olear boolean,JnJ boolean)0 -geInternaIFrame 1 (SUlngI boolean,
38、boolean, booEeal boolean)JlnternaIFirameI1JInterrialFrameDemOW tInternIFraiTIeJlnternaIFramelT «sntetPaneCanerGJIFTternalFrameDemo(aCIOn Pe rform dActi EveQVOld101IfI Wmaln(S(ringVE>ld實現(xiàn)代碼:客戶端類Main:PUbliC class Mai n PUbliC StatiC Void main( Stri ng args)SyStem.out.println("Hello World!
39、");new Jln ternalFrameDemo();類 JInternalFrameDemo :import java.awt.BorderLayout;import java.awt.C Ontainer;import java.awt.Dime nsion;import java.awt.eve nt.Act ionEvent;import java.awt.eve nt.Act ion LiSte ner;import java.awt.eve nt.Wi ndowAdapter;import java.awt.eve nt.Wi ndowEve nt;import ja
40、vax.swi ng.J BUtt on;import javax.swi ng.J DeSktOPPa ne;import javax.swi ng.JF rame;PUbIiC class JI nternalFrameDemo exte nds JFrame impleme nts ACtion LiSte ner PriVate StatiC JIn ternalFrame1 in ternalFrame;ContainerConten tPa ne = this.getC Onten tPa ne();PUbIiC JI nternalFrameDemo() super("
41、主窗體");Conten tPa ne.setLayout (new BOrderLayout();JBUttOn button = new JBUttOn("創(chuàng)建一個子窗體");butt on .addAct ion LiSte ner(this);Conten tPa ne.add(butt on, BOrderLayout.SOUTH);this.setSize(new Dimension(300, 300);this.setVisible(true);this.addWi ndowListe ner(new Win dowAdapter() OVerrid
42、ePUbIiC void Win dowClos in g(Wi ndowEve nt e) SyStem.exit(O););PUbIiC Void acti On PerfOrmed(ACt ion EVe nt e) internalFrame = JlnternalFrame1.getJInternalFrame1(" 子窗體", true, true, true, true);in ternalFrame.setSize( new Dime nsio n(200, 200);in ternalFrame.setVisible(true);JDeSktOPPa ne
43、 desktopPa ne = new JDeSktOPPa ne();Conten tPa ne.add(desktopPa ne); desktopPa ne.add(i ntern alFrame);try intern alFrame.setSelected(true); CatCh (java.bea ns.PropertyVetoExcepti On ex) SyStem.out.pri ntl n("Excepti On while SeIeCt in g");類 JlnternalFrame1 :import javax.swi ng.JIn ternalF
44、rame;PUbIiC class Jlntern alFrame1 exte nds Jln ternalFrame PriVate StatiC Jlntern alFrame1 JIF1 = n ull;PriVate JInternalFrame1(String name, boolean b1, boolean b2, boolean b3, boolean b4) super( name, b1, b2, b3, b4);PUbIiC StatiC JInternalFrame1 getJInternalFrame1(String name, boolean b1, boolean
45、 b2, boolea n b3, boolea n b4) if (JIF1 = nUlI) JIF1 = new JInternalFrame1(name, b1, b2, b3, b4);return JIF1; EI QUICkSDrt BlnarySsarchO DatdoPerdtIOnQ -= MnIllnIlLlnl Init)VOhd Gl - srchrift(1 IntI Int) Int7.類圖:O l qukkSoMir<a IrtI inc) VoId G) r binarysearch(InUII IrrtI it Int) InltiA*/K1 : ! 1
46、 ;"5 L0 rfa DataOPAdapterO : CJSartIQUlCkSOrtG HnarySearchSInarySearehODHta OPAeh plrtQufciScHt BiniarySea rch sea rc( lm1 kt+lnti Iffi)'in.O HMKIntJjUtVOldAcr ate*WWqq二三0 h MaIn.Q mln(StFing)wId實現(xiàn)代碼:目標抽象類DataoPeratiOn :PUbliC in terface DataOPerati On PUbIiC void sort(i nt a,i nt low,i nt
47、high);PUbIiC int SearCh(i nt SrCArra y, int Start, int end, int key);適配者類QUiCkSOrt:PUbIiC class QUiCkSOrt PUbIiC void quickSout(i nt a,i nt low,i nt high)int Start = low;int end = high;int key = alow;while(e nd>start)/從后往前比較while(e nd>start&&ae nd>=key)/如果沒有比關鍵值小的,比較下一個,直到有比關鍵值小的交換位
48、置,然后又從前往后比較en d-;if(ae nd<=key)int temp = ae nd;ae nd = astart;astart = temp;/從前往后比較while(end>start&&astart<=key)/如果沒有比關鍵值大的,比較下一個,直到有比關鍵值大的交換位置start+;if(astart>=key)int temp = astart;astart = ae nd; ae nd = temp;/此時第一次循環(huán)比較結束,關鍵值的位置已經(jīng)確定了。左邊的值都比關鍵值小,右邊的值都比關鍵值大,但是兩邊的順序還有可能是不一樣的,進行下
49、面的遞 歸調(diào)用/遞歸if(start>low) quickSout(a,low,start-1);/左邊序列。第一個索引位置到關鍵值索引-1if(end<high) quickSout(a,end+1,high);/右邊序列。從關鍵值索引+1到最后一個 適配者類 BinarySearch:PUbIiC class Bin arySearch PUbIiC int bin arySearch(i nt SrCArray, int Start, int end, int key)int mid = (end - Start) / 2 + start;if (SrCArraymid =
50、key) return mid;if (Start >= end) return -1; else if (key > SrCArraymid) return bin arySearch(srcArray, mid + 1, end, key); else if (key < SrCArraymid) retur n bin arySearch(srcArray, start, mid - 1, key);return -1;適配器類 DataoPAdaPter:PUbliC class DataOPAdaPter impleme nts DataOPerati On Pri
51、Vate QUiCkSOrt qSort;PriVate Bin arySearch bin arySearch;PUbIiC DataOPAdaPter(QUiCkSOrt qSort,B in arySearch bin arySearch) this.qSort=qSort;this.b in arySearch=b in arySearch;OVerridePUbIiC int SearCh(i nt SrCArra y, int Start, int end, int key)retur n bin arySearch.b in arySearch(srcArray,start,e
52、nd,key);OVerridePUbIiC void sort(i nt a,i nt low,i nt high) qSort.quickSout(a,low,high);客戶端類Main :PUbIiC class Mai n PUbIiC StatiC void main(String args) DataOPeratiO ndataOperati On =newDataOPAdapter( newQUiCkSort(),newBin arySearch();in t a = 12,20,5,16,15,1,30,45,23,9;SyStem.out.println("排序前
53、:");for(i nt i = 0; i<a .Ien gth; i+)SyStem.out.pri nt(ai+"");int Start = 0;int end = a.len gth-1;dataOperati on. sort(a,start,e nd);SyStem.out.println("n"+"實現(xiàn)快速排序:");for(i nt i = 0; i<a .Ien gth; i+)SyStem.out.pri nt(ai+"");SyStem.out.println("
54、;n"+"實現(xiàn)了二分查找算法,查找“ 20” ");SyStem.out.pri ntln( dataOperati on. SearCh(a,0,a .Ien gth -1,20);8.類圖:PIdnePaCkage BridgePatter n;crtPlsf½ VOId布Jr0 匕 PrOdUCtfflrI總 r PraduB) voi<d PtaneO Pe0 PaSSengerPIaneO - CredtePLane)Wid0 CargOWanieQ CreJtePIaIn¢()VOki I-*cfea*-h AIirbUSPrQ0 - McO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 培訓走進小區(qū)活動方案
- 夏日客戶關愛活動方案
- 2025-2030中國自動駕駛技術分級落地與政策法規(guī)分析報告
- 太原王府井商場活動方案
- 大學獻血活動方案
- 天天吃肉活動方案
- 失泄密警示教育活動方案
- 大班繡花活動方案
- 天津公司拓展訓練活動方案
- 2025-2030中國智慧零售行業(yè)創(chuàng)新模式與增長潛力研究報告
- DB13T 1320.10-2010 中藥材種子質(zhì)量標準 第10部分:防風
- (2025春新版本)人教版七年級生物下冊全冊教案
- 醫(yī)院殘疾評定管理制度
- 雜志分揀打包服務合同4篇
- 2025年D-對羥基苯甘氨酸項目市場調(diào)查研究報告
- 2024-2025 學年八年級英語下學期期末模擬卷 (常州專用)解析卷
- 航空發(fā)動機關鍵部件項目運營管理手冊(范文)
- 2025年中國社區(qū)O2O商業(yè)模式市場分析報告
- 高考語文專題復習 -語用新題型得名方式、構詞方式辨析
- 預防強對流天氣安全教育
- 高低壓變配電工程方案投標文件(技術方案)
評論
0/150
提交評論