對(duì)設(shè)計(jì)模式的理解_第1頁
對(duì)設(shè)計(jì)模式的理解_第2頁
對(duì)設(shè)計(jì)模式的理解_第3頁
對(duì)設(shè)計(jì)模式的理解_第4頁
對(duì)設(shè)計(jì)模式的理解_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Evaluation Warning: The document was created with Spire.Doc for .NET. 設(shè)設(shè)計(jì)模式式的理解解 研研讀GOOF的設(shè)計(jì)模模式和閻宏宏博士的的Jaava 與模式式已經(jīng)有有一段時(shí)時(shí)間,自己己頗有一一些體會(huì)會(huì),自己己面向?qū)?duì)象和軟軟件設(shè)計(jì)計(jì)模式有有了一些些深入的的理解,下下面就一一步一步步開始自自己的模模式歷程程吧,從從最簡單單的工廠廠模式到到適配器器模式,從從 Statte模式式到Deecorratoor模式式,一直直到最復(fù)復(fù)雜難懂懂的viisittor模模式,沒沒有一個(gè)個(gè)模式不不體現(xiàn)了了前輩的的聰明才才智,需需要我們們大家用用心去體

2、體會(huì)和理理解 恰當(dāng)當(dāng)?shù)厥褂糜迷O(shè)計(jì)模模式,能能使軟件件系統(tǒng)的的架構(gòu)更更合理,能能使將來來的維護(hù)護(hù)和修改改更方便便,能使使數(shù)據(jù)庫庫表結(jié)構(gòu)構(gòu)的設(shè)計(jì)計(jì)更合理理,恰當(dāng)當(dāng)?shù)娜哂嘤嗪蛿?shù)據(jù)據(jù)關(guān)聯(lián),能能使我們們的軟件件更多地地適應(yīng)變變化,總總之,它它的的作作用是不不可低估估的!1,簡單工工廠,工工廠方法法和抽象象工廠模式式對(duì)于簡單工工廠來說說,它的的工廠只只能是這這個(gè)樣子子的publiic cclasss SSimpplyFFacttoryy /* 靜態(tài)工工廠方法法*/publiic sstattic Proouctt faactoory(Strringg whhichh) tthroow NNoSuuchPP

3、rodducttExccptiion iff(whhichh.eqquallIgnnoreeCasse(prooducct1) reeturrn nnew Prooducct1(); ellse if(whiich.equualssIgnnoreeCasse(prooducct2) retturnn neew PProdductt2(); elsse iif(wwhicch.eequaalsIIgnooreCCasee(pprodductt3) retturnn neew PProdductt3(); elsse tthroow NoSSuchhProoducctExxcpttionn(NNo

4、SuuchPProdductt); 而對(duì)產(chǎn)品PProdductt1,PProdductt2,PProdductt3,可以執(zhí)執(zhí)行接口口Prooducct,也也可以不不執(zhí)行接接口Prroduuct(當(dāng)當(dāng)然這樣樣不好),這這個(gè)Prroduuct接接口只是是用來抽抽象具體體prooducct用的的publiic iinteerfaace Prooducct voiid pprodducttMetthodd1(); /這這些只是是 voiid pprodducttMetthodd2(); voiid pprodducttMetthodd3();對(duì)工廠來說說,只要要有這么么一種產(chǎn)產(chǎn)品,一一般來說說就要在在

5、工廠里里有它的的生產(chǎn)的的方法, 否則拋出異常,而要工廠生產(chǎn)的話,也必須下達(dá)生產(chǎn)什么產(chǎn)品的命令,至少要向工廠發(fā)出信號(hào),讓工廠足以區(qū)分是要生產(chǎn)什么產(chǎn)品,否則工廠是不知道生產(chǎn)哪一種產(chǎn)品,對(duì)于簡單工工廠來說說,就是是需要在在工廠中中枚舉所所有的產(chǎn)產(chǎn)品,所所以說簡簡單工廠廠還是非非常笨的的。 if(whhichh.eqquallIgnnoreeCasse(prooducct1) 只是是用來區(qū)區(qū)分生產(chǎn)產(chǎn)什么產(chǎn)產(chǎn)品的標(biāo)標(biāo)記值,(也也可以根根據(jù)產(chǎn)品品其它屬屬性來判判斷,比比如產(chǎn)品品類型,產(chǎn)產(chǎn)品大小小,總之之能夠區(qū)區(qū)分是什什么產(chǎn)品品的屬性性,或者者是與產(chǎn)產(chǎn)品屬性性相關(guān)的的變量)或者說標(biāo)記值是A,生產(chǎn)A產(chǎn)品,或者

6、工廠里定義不是這樣的,我偏偏要生產(chǎn)B產(chǎn)品,或者再特殊一些,我偏偏要生產(chǎn)A產(chǎn)品+B產(chǎn)品,那么就要return new ProductA()+new ProductB()了。這樣,我們們就可以以看出一一個(gè)問題題來,如如果要能能夠被簡簡單工廠廠生產(chǎn)出出來,就就必須在在簡單工工廠中有有能夠生生產(chǎn)出的的它的方方法定義義,當(dāng)然然還需要要有這個(gè)個(gè)具體產(chǎn)產(chǎn)品類的的定義,就就是有cclasss對(duì)應(yīng)應(yīng),這樣樣確保在在簡單工工廠中nnew 它的時(shí)時(shí)候不會(huì)會(huì)拋出 NoSSuchhProoducct的Exccepttionn.對(duì)于工廠方方法來說說實(shí)質(zhì)上它是是讓工廠廠實(shí)現(xiàn)了了抽象的的工廠接接口,它它把具體體怎么生生產(chǎn)一種

7、種東西,放放在具體體的工廠廠去實(shí)現(xiàn)現(xiàn)了,所所謂”延遲到到子類中中實(shí)現(xiàn)“publiic iinteerfacce CCreaatorr pubblicc Prroucct ffacttoryy();publiic SSubCCreaatorr1 iimpllentt Crreattor puubliic PProuuct facctorry() reeturrn nnew ConncreetePProdductt1(); publiic SSubCCreaatorr2 iimpllentt Crreattor puubliic PProuuct facctorry() rretuurn neww

8、 CooncrreteeProoducct2(); 請(qǐng)注意:返返回類型型是Prroduuct型型的!這樣客戶端端調(diào)用是是直接nnew 一個(gè)具具體工廠廠的實(shí)例例,然后后命令它它去生產(chǎn)產(chǎn),而對(duì)對(duì)于具體體工廠的的父類(既既工廠接接口,接接口完全全可以改改成子類類繼承父父類來實(shí)實(shí)現(xiàn),只只是這樣樣不好,不不符合OOO的原原則),它它完全不不知道什什么產(chǎn)品品被生產(chǎn)產(chǎn)了,甚甚至它連連那個(gè)具具體工廠廠被實(shí)例例化它都都不知道道抽象工廠模模式 抽象工廠模模式主要要是用來來解決具具體產(chǎn)品品是有幾幾類產(chǎn)品品簇的問問題publiic iinteerfaace Creeatoor puubliic PProuuctAA

9、faactooryAA(); puubliic PProuuctBB faactooryBB();publiic iinteerfaace ProoducctA /ProoducctA 接口publiic iinteerfaace ProoducctB /ProoducctB 接口publiic cclasss CConCCreaatorr1 iimpllemeentss CCreaatorr puubliic PProuuctAA faactooryAA() reeturrn nnew ConncreetePProdducttA1(); puubliic PProuuctBB faactoo

10、ryBB() reeturrn nnew ConncreetePProdducttB1(); publiic cclasss CConCCreaatorr2 iimpllemeentss Crreattor puubliic PProuuctAA faactooryAA() rretuurn neww PrroduuctAA2(); puubliic PProuuctBB faactooryBB() reeturrn nnew ProoducctB22(); publiic cclasss PProdducttA1 impplemmentts ProoducctA publlic Prrodu

11、uctAA1() publiic cclasss PProdducttA2 impplemmentts ProoducctA publlic PrroduuctAA2() publiic cclasss PProdducttB1 impplemmentts ProoducctB publlic PrroduuctBB1() publiic cclasss PProdducttB2 impplemmentts ProoducctB publlic PrroduuctBB2() 實(shí)際上是這這樣的1,兩個(gè)工工廠類CConCCreaatorr1,ConnCreeatoor2都都實(shí)現(xiàn)了了Creeatoo

12、r接口口2,ProoucttA1,ProoducctA22都實(shí)現(xiàn)現(xiàn)了PrroduuctAA接口3,ProoucttB1,ProoducctB22都實(shí)現(xiàn)現(xiàn)了PrroduuctBB接口4,ConnCreeatoor1負(fù)負(fù)責(zé)生產(chǎn)產(chǎn)1類型的的產(chǎn)品(包括PrroduuctAA1,ProoducctB11)5,ConnCreeatoor2負(fù)負(fù)責(zé)生產(chǎn)產(chǎn)2類型的的產(chǎn)品(包括PrroduuctAA2,ProoducctB22)6,工廠方方法也有有這樣的的特征,也也就是說說Creeatoor不知知道什么么被生產(chǎn)產(chǎn)出來,甚甚至不知知道CoonCrreattor11還是CoonCrreattor22被實(shí)例例化了,因因

13、為clliennt高興興調(diào)那一一個(gè)工廠廠,就調(diào)調(diào)那一個(gè)個(gè)工廠,就就是說工工廠能生生產(chǎn)什么么,對(duì)客客戶端是是可見的的。甚至至還有一一種情況況,客戶戶端高興興起來就就生產(chǎn)了了ProoducctA11,我就就不生產(chǎn)產(chǎn)ProoducctA22,因?yàn)闉樯厦娴牡睦又兄兴鼈冞€還都是松松散的,沒沒有綁定定在一起起于是提出另另外一個(gè)個(gè)例子,也也是老提提起的電電腦類型型的例子子1,電腦生生產(chǎn)商是是接口,2,CUPP是接口口,3,硬盤是是接口,4,IBMM工廠是是制造IIBM品品牌的電電腦的工工廠5,DELLL工廠廠是制造造DElll品牌牌的電腦腦的工廠廠為討論方便便,就認(rèn)認(rèn)為電腦腦=CUUP+硬硬盤;6,所以呀

14、呀CUPP有IBMM的CPUU和DELLL的CPUU7,同樣硬硬盤也是是有IBBM的硬硬盤和DDELLL的硬盤盤8,IBMM工廠生生產(chǎn)IBBM的CPUU和IBMM的硬盤盤,絕對(duì)對(duì)不生產(chǎn)產(chǎn)DELLL的CPUU,也不不生產(chǎn)DDELLL的硬盤盤9,同樣DDELLL工廠也也是一樣樣publiic iinteerfaace 電腦腦生產(chǎn)商商 puubliic CCPU 制造CPPU(); puubliic 硬硬盤 制造硬硬盤(); puubliic 電電腦 制造電電腦();publiic iinteerfaace CPUUpubliic iinteerfaace 硬盤publiic cclasss IIB

15、M的的CPUU immpleemennts CPUU puubliic IBMM的CPUU();publiic cclasss IIBM的的硬盤 impplemmentts 硬硬盤 ppubllic IBMM的硬盤盤();publiic cclasss DDELLL的CPUU immpleemennts CPUU ppubllic DELLL的CPUU();publiic cclasss DDELLL的硬盤盤 immpleemennts 硬盤 puubliic DELLL的硬硬盤();/下面是是IBMM工廠publiic cclasss IBMM工廠 immpleemennts 電腦生生產(chǎn)商

16、prrivaate CPUU IBBM的CPUU私有變變量=nnulll; prrivaate 硬盤 IIBM的的硬盤私私有變量量=nuull; prrivaate CPUU 制造造CPUU() retturnn nnew IBMM的CPUU(); privvatee 硬盤盤 制造硬硬盤() rretuurn neew IIBM的的CPUU(); publlic 電腦 制造電電腦() tryy IBMM的CPUU私有變變量=tthiss.制造造CPUU(); IBMM的硬盤盤私有變變量=tthiss.制造造硬盤(); if(IBMM的CPU私有變變量!=nulll&IBMM的硬盤盤私有變變量!

17、=nulll) rettrunn (IBMM的CPUU私有變變量+IIBM的的硬盤私私有變量量); /組裝裝成IBBM電腦腦 cattch(Exccepttionn e) SSysttem.outt.prrinttln(制造造IBMM電腦失失?。?; 這樣,客戶戶端無法法通過命命令單生生產(chǎn)出一一個(gè)CPPU來,這這樣抽象象才真正正成為一一個(gè)完整整產(chǎn)品的的工廠,只只要向工工廠發(fā)出出生產(chǎn)的的命令,一一臺(tái)完整整的電腦腦就生產(chǎn)產(chǎn)出來了了,而工工廠怎么么生產(chǎn)的的,生產(chǎn)產(chǎn)了哪些些部件,外外界就看看不見了了,外界界就知道道這個(gè)工工廠是生生產(chǎn)IBBM電腦腦整機(jī)的的工廠!DELL電電腦工廠廠一樣/* 下面面來改錯(cuò)

18、錯(cuò), 請(qǐng)指出出下面片片段的錯(cuò)錯(cuò)誤*/publiic aabsttracct cclasss FFacttoryy pubblicc abbstrractt Saamplle ccreaatorr(); pubblicc abbstrractt Saamplle2 creeatoor(); publiic cclasss SSimppleFFacttoryy exxtennds Facctorry pubblicc Saamplle ccreaatorr() pubblicc Saamplle2 creeatoor() publiic cclasss BBombbFacctorry eextee

19、ndss Faactoory pubblicc Saamplle ccreaatorr() pubblicc Saamplle2 creeatoor() 思考:上面面的代碼碼錯(cuò)在哪哪?/* 改錯(cuò)錯(cuò)結(jié)束 */2,buiildeer模式式的理解解作者:羅鵬鵬 EEmaiil:lluoppenggecc.coom.ccn簡單地說,就就好象我我要一座座房子住住,可是是我不知知道怎么么蓋(簡簡單的砌砌墻,層層次較低低),也也不知道道怎么樣樣設(shè)計(jì)(建建幾個(gè)房房間,幾幾個(gè)門好好看,層層次較高高),于是我我需要找找一幫民民工,他他們會(huì)砌砌墻,還還得找個(gè)個(gè)設(shè)計(jì)師師,他知知道怎么么設(shè)計(jì),我我還要確確保民工工聽設(shè)計(jì)

20、計(jì)師的領(lǐng)領(lǐng)導(dǎo),而而設(shè)計(jì)師師本身也也不干臟臟活,重重活,光光是下命命令,這這里砌一一堵墻,這這里砌一一扇門,這這樣民工工開始建建設(shè),最最后,我我可以向向民工要要房子了了。在這這個(gè)過程程中,設(shè)設(shè)計(jì)師是是什么也也沒有,除除了他在在腦子里里的設(shè)計(jì)計(jì)和命令令,所以以要房子子也是跟跟民工要要,記住住了!packaage buiildeer;publiic iinteerfaace Buiildeerpubliic voiid mmakeeWinndoww();publiic voiid mmakeeFlooor();publiic Rooom gettRooom();/*/packaage buiilde

21、er;publiic cclasss DDesiigneer pubblicc Deesiggnerr() pubblicc vooid ordder(Buiildeer buiildeer) /這些下下等人沒沒有知識(shí)識(shí),沒有有文化,哈哈哈,得得聽我的的 buiildeer.mmakeeWinndoww(); buiildeer.mmakeeFlooor(); pubblicc sttatiic vvoidd maain(Strringg arggs) DDesiigneer ddesiigneer1 = nnew Dessignner(); /*/packaage buiildeer;pub

22、liic cclasss MMinggongg iimpllemeentss Buuildder priivatte Strringg wiindoow=; priivatte Strringg flloorr=; pubblicc Miingoong() pubblicc sttatiic vvoidd maain(Strringg arggs) MMinggongg miingoong11 = neww Miingoong(); pubblicc vvoidd maakeWWinddow() winndoww=neew SStriing(wiindoow); pubblicc vvoidd

23、 maakeFFlooor() flooor=neww Sttrinng(flooor); pubblicc RRoomm ggetRRoomm() if(!wwinddow.equualss()&(!flooor.equualss() SSysttem.outt.prrinttln(rooom reaady!); rretuurn neww Rooom(); elsse rretuurn nulll; /*/packaage buiildeer;publiic cclasss RRoomm priivatte Strringg wiindoow=; priivatte Strringg fl

24、loorr=; pubblicc Rooom() pubblicc sttatiic vvoidd maain(Strringg arggs) RRoomm rooom11 = neww Rooom(); /*/packaage buiildeer;publiic cclasss CClieent pubblicc Clliennt() pubblicc sttatiic vvoidd maain(Strringg arggs) Buiildeer mminggongg=neew MMinggongg(); Dessignner deesiggnerr=neew Deesiggnerr();

25、dessignner.ordder(minngonng); minngonng.ggetRRoomm(); 3, 適配配器模式式的理解解 作者:羅羅鵬 emaail:luoopenng publlic cllasss wiindoow的軟軟件 pubblicc vooid runn() Sysstemm.ouut.pprinnt(我運(yùn)行行在wiindoow上); pubblicc vooid runn1() Sysstemm.ouut.pprinnt(我運(yùn)行行在wiindoow上的的runn1方法法); publlic cllasss liinuxx的軟件件 pubblicc vooid ru

26、nn() Sysstemm.ouut.pprinnt(我運(yùn)行行在liinuxx上); publlic cllasss 適配器器 exxtennds wiindoow的軟軟件 privvatee llinuux的軟軟件 軟件1; /實(shí)實(shí)際上是是聚合的的使用 publlic 適適配器(linnux的的軟件 軟件變變量) thiis.軟軟件1= 軟件件變量; publlic vooid runn() 軟件1.runn(); publlic vooid runn1() Systtem.outt.prrintt(“已經(jīng)被被adppterr改寫了了”); 客戶段 publlic cllasss teest

27、 publlic staaticc vooid maiin(SStriing arggs) linuux的軟軟件 ttestt1=nnew linnux的的軟件(); 適配器 teest22=neew 適適配器(tesst1); testt2.rrun(); testt2.rrun11(); 4,Memmentto 模模式理解解作者:羅鵬鵬 emmaill:luuopeengnMemennto 模式說說的明白白一點(diǎn),就就是事情情太多,你你一個(gè)人人記不住住,找一一個(gè)人專專門幫你你記住,用用的時(shí)候候去問一一下。就象董事長長和秘書書一樣publiic cclasss MManaage publiic

28、 Strringg nnextt_weeek; /下下個(gè)星期期的安排排publiic Strringg nn_neext_weeek; /下個(gè)星星期的安安排publiic Mannagee() publlic Asssisttantt geetMeemennto() retuurn neww Asssisstannt(tthiss); publiic vvoidd seetMeemennto(Asssisttantt asssisstannt)next_weeek=aassiistaant.nexxt_wweekk;n_nexxt_wweekk=asssisstannt.nn_neext_we

29、eek;publiic cclasss AAssiistaant impplemmentts jjavaa.ioo.Seeriaalizzablle publiic Strringg nnextt_weeek;publiic Strringg nn_neext_weeek; publiic Asssisttantt(Maanagge mmanaage)next_weeek=mmanaage.nexxt_wweekk;n_nexxt_wweekk=maanagge.nn_neext_weeek;publiic cclasss TTestt publiic TTestt() publiic sst

30、attic voiid mmainn(Sttrinng arrgs) Managge mmanaage=neww Maanagge();managge.nnextt_weeek=見客客戶;managge.nn_neext_weeek=見大客客戶;Systeem.oout.priintlln(mmanaage.nexxt_wweekk);Systeem.oout.priintlln(mmanaage.n_nnextt_weeek);Assisstannt aassiistaant=mannagee.geetMeemennto();managge.nnextt_weeek=見11111客戶戶;ma

31、nagge.nn_neext_weeek=見11111111大客戶戶;Systeem.oout.priintlln(mmanaage.nexxt_wweekk);Systeem.oout.priintlln(mmanaage.n_nnextt_weeek);managge.ssetMMemeentoo(asssisstannt);Systeem.oout.priintlln(mmanaage.nexxt_wweekk);Systeem.oout.priintlln(mmanaage.n_nnextt_weeek); 5,staate模模式理解解作者:羅鵬鵬 eemaiil: luoopenng

32、主要是用于于狀態(tài)的的變化,就就象紅綠綠燈一樣樣如何使用sstatte模式式1,要一個(gè)個(gè)狀態(tài)管管理類2,狀態(tài)接接口3,各種子子狀態(tài)實(shí)實(shí)現(xiàn)狀態(tài)態(tài)接口Statee模式的的效果 1)它它將與特特定狀態(tài)態(tài)的行為為局部化化,并且且將不同同的行為為分割開開來 2)它它使得狀狀態(tài)轉(zhuǎn)化化顯式化化 3)SStatte對(duì)象象可以被被共享 staate模模式中誰誰定義狀狀態(tài)轉(zhuǎn)化化? staate模模式中并并沒有指指定哪一一個(gè)參與與者定義義狀態(tài)轉(zhuǎn)轉(zhuǎn)換準(zhǔn)則則。換句句話說,它它們可以以在Coonteext中中定義,也也可以在在staate子子類自身身指定她她們的后后繼狀態(tài)態(tài)以及何何時(shí)進(jìn)行行轉(zhuǎn)換,后后者通常常更靈活活。pub

33、liic iinteerfaace Staatepubliic aabsttracct vvoidd haandlleGrreenn(Sttatee sttatee);publiic aabsttracct vvoidd hhanddleRRed(Staate staate);publiic aabsttracct SStatte ggetCColoor(); publlic claass Mannagee prrivaate Staate staate=nulll; ppubllic Mannagee(Sttatee sttatee) tthiss.sttatee=sttatee; puub

34、liic vvoidd chhanggeTooGreeen() thhis.staate=neww GrreennLigght(); sttatee.haandlleGrreenn(sttatee); puubliic vvoidd chhanggeTooRedd() thhis.staate=neww ReedLiightt(); sttatee.haandlleReed(sstatte); publlic claass GreeenLLighht iimpllemeentss Sttatee publlic Staate staate=nulll; publlic Staate gettC

35、ollor() reeturrn sstatte; publlic voiid hanndleeGreeen(Staate staate) Sysstemm.ouut.pprinntlnn(綠綠燈,前前進(jìn)); publlic voiid hanndleeRedd(Sttatee sttatee) Sysstemm.ouut.pprinntlnn(,); publlic claass ReddLigght impplemmentts SStatte publlic Staate staate=nulll; publlic Staate geetCoolorr() reeturrn sstatte

36、; publlic voiid hanndleeGreeen(Staate s) Sysstemm.ouut.pprinntlnn(,cc); publlic voiid hanndleeRedd(Sttatee s) Sysstemm.ouut.pprinntlnn(紅紅燈,SStopp!); publiic cclasss TTestt pubblicc Teest() pubblicc sttatiic vvoidd maain(Strringg arggs) GreeenLLighht sstatte=nnew GreeenLLighht(); Mannagee mmanaage=ne

37、ww Maanagge(sstatte); mannagee.chhanggeTooRedd(); mannagee.chhanggeTooGreeen(); mannagee.chhanggeTooGreeen(); mannagee.chhanggeTooGreeen(); mannagee.chhanggeTooRedd(); GOF片段段賞析1,Deccrattor 模式不不同于AAdappterr模式,因因?yàn)檠b飾飾僅改變變對(duì)象的的職責(zé)而而不改變變它的接接口,而而適配器器將給對(duì)對(duì)象一個(gè)個(gè)全新的的接口。2,Commpossitee模式:可以將將裝飾視視為一個(gè)個(gè)退化的的、僅有有一個(gè)組組件的

38、組組合。然然而,裝裝飾僅給給對(duì)象添添加一些些額外的的職責(zé)它它的目的的不是在在于對(duì)象象聚集6,Prooxy模模式publiic iinteerfaace Subbjecctpubliib vvoidd reequeest();publiic RReallSubbjecct iimpllemeentss SSubjjecttpubliic vvoidd reequeest()Systeem.oout.priintlln(正在處處理請(qǐng)求求!);publiic cclasss PProxxy iimpllemeentss SSubjjecttprivaate ReealSSubjjectt reeal

39、SSubjjectt;publiic Prooxy()publiic vvoidd rrequuestt() if(rreallSubbjecct=nulll) /這里里有個(gè)單單例 reaalSuubjeect=neww ReealSSubjjectt(); reaalSuubjeect.reqquesst(); Sysstemm.ouut.pprinntlnn(哈哈哈,是是我在處處理!); publiic cclasss CClieentpubliic sstattic voiid mmainn(Sttrinng aargss)Subjeect subbjecct=nnew Prooxy()

40、;subjeect.reqquesst(); /客戶端端沒有看看出來,實(shí)實(shí)際上客客戶端發(fā)發(fā)出的請(qǐng)請(qǐng)求,是是Prooxy在在處理/正常的的沒有采采用代理理的話,代代碼是這這個(gè)樣子子的/*Subjeect subbjecct=nnew ReaalSuubjeect();subjeect.reqquesst(); */*思考考題*/Proxyy模式publiic iinteerfaace Subbjecctpubliib vvoidd reequeest();publiic RReallSubbjecct iimpllemeentss SSubjjecttpubliic vvoidd reequee

41、st()Systeem.oout.priintlln(正在處處理請(qǐng)求求!);publiic cclasss PProxxy iimpllemeentss SSubjjecttprivaate ReealSSubjjectt reealSSubjjectt;publiic Prooxy()publiic vvoidd rrequuestt() if(rreallSubbjecct=nulll) /這里里有個(gè)單單例 reaalSuubjeect=neww ReealSSubjjectt(); reaalSuubjeect.reqquesst(); Sysstemm.ouut.pprinntlnn(

42、哈哈哈,是是我在處處理!); publiic cclasss CClieentpubliic sstattic voiid mmainn(Sttrinng aargss)Subjeect subbjecct=nnew Prooxy();subjeect.reqquesst(); /客戶端端沒有看看出來,實(shí)實(shí)際上客客戶端發(fā)發(fā)出的請(qǐng)請(qǐng)求,是是Prooxy在在處理/正常的的沒有采采用代理理的話,代代碼是這這個(gè)樣子子的/*Subjeect subbjecct=nnew ReaalSuubjeect();subjeect.reqquesst(); */7,Prootyppe模式式理解比如說有個(gè)個(gè)叫張三三

43、的一個(gè)個(gè)人可以以復(fù)制,呵呵呵,他他還有一一本書imporrt jjavaa.ioo.*;imporrt jjavaa.ioo.Seeriaalizzablle;publiic cclasss ZZhanngsaan impplemmentts CClonneabble,Serriallizaablee ppubllic Strringg naame=zhhanggsann; ppubllic Strringg naame11=zzhanngsaan1; / puubliic BBookk boook; ppubllic Boook bbookk=neew BBookk(); puubliic

44、ZZhanngsaan() thiis.nnamee=zzhanngsaan; thhis.boook=nnew Boook(); pubblicc Obbjecct cclonne() trry retturnn suuperr.cllonee(); cattch(ClooneNNotSSuppporttedEExceeptiion e) reeturrn nnulll; publlic Objjectt deeepCClonne() thhrowws IIOExxcepptioon,OOptiionaalDaataEExceeptiion,ClaassNNotFFounndExxceppt

45、ioon BByteeArrrayOOutpputSStreeam bo=neww BByteeArrrayOOutpputSStreeam(); OObjeectOOutpputSStreeam oo=neww OObjeectOOutpputSStreeam(bo); ooo.wwritteObbjecct(tthiss); BByteeArrrayIInpuutSttreaam bbi=nnew BytteArrrayyInpputSStreeam(bo.toBByteeArrray(); OObjeectIInpuutSttreaam ooi=nnew ObjjecttInpputSS

46、treeam(bi); reeturrn (oi.reaadObbjecct(); ppubllic Boook ggetBBookk() rretuurn boook; ppubllic Strringg geetNaame() rretuurn namme; /*/imporrt jjavaa.ioo.*;imporrt jjavaa.ioo.Seeriaalizzablle;publiic cclasss ZZhanngsaan impplemmentts CClonneabble,Serriallizaablee ppubllic Strringg naame=zhhanggsann;

47、 ppubllic Strringg naame11=zzhanngsaan1; / puubliic BBookk boook; ppubllic Boook bbookk=neew BBookk(); ppubllic Zhaangssan() tthiss.naame=zhhanggsann; tthiss.boook=neww Boook(); ppubllic Objjectt cllonee() trry retturnn suuperr.cllonee(); cattch(ClooneNNotSSuppporttedEExceeptiion e) rretuurn nulll;

48、publlic Objjectt deeepCClonne() thhrowws IIOExxcepptioon,OOptiionaalDaataEExceeptiion,ClaassNNotFFounndExxcepptioon ByteeArrrayOOutpputSStreeam bo=neww BByteeArrrayOOutpputSStreeam(); ObjeectOOutpputSStreeam oo=neww OObjeectOOutpputSStreeam(bo); oo.wwritteObbjecct(tthiss); ByteeArrrayIInpuutSttreaam

49、 bbi=nnew BytteArrrayyInpputSStreeam(bo.toBByteeArrray(); ObjeectIInpuutSttreaam ooi=nnew ObjjecttInpputSStreeam(bi); retuurn (oii.reeadOObjeect(); publiic BBookk geetBoook()returrn bbookk; publlic Strringg geetNaame() retuurn namme; /*/ publlic claass tesst publiic sstattic voiid mmainn(Sttrinng aa

50、rgss) ZZhanngsaan ppersson=neww Zhhanggsann(); ZZhanngsaan ccopyy= ( Zhhanggsann) ppersson.cloone(); SSysttem.outt.prrinttln(perrsonn.naame); SSysttem.outt.prrinttln(coppy.nnamee); SSysttem.outt.prrinttln(tuure of fallse? +(ccopyy.boook=peersoon.bbookk); SSysttem.outt.prrinttln(tuure of fallse? +(cc

51、opyy.geetNaame()=perrsonn.geetNaame(); ttry ZZhanngsaan ddeeppcoppy= (Zhhanggsann) ppersson.deeepCllonee(); SSysttem.outt.prrinttln(tuure of fallse? +(ddeeppcoppy.ggetNNamee()=peersoon.ggetNNamee(); SSysttem.outt.prrinttln(tuure of fallse? +(ddeeppcoppy.ggetBBookk()=peersoon.ggetBBookk(); SSysttem.o

52、utt.prrinttln(tuure of fallse? +(ddeeppcoppy.bbookk=ppersson.boook); SSysttem.outt.prrinttln(tiitlee? +deeepccopyy.boook.tittle); SSysttem.outt.prrinttln(perrsonn.boook.pagges); SSysttem.outt.prrinttln(tiitlee? +peersoon.bbookk.tiitlee); SSysttem.outt.prrinttln(deeepcoopy.boook.ppagees); SSysttem.ou

53、tt.prrinttln(tuure of fallse? +(ddeeppcoppy.bbookk=ppersson.boook); caatchh (EExceeptiion e) Syysteem.oout.priintlln(errror); 所謂cloone有有深cllonee和淺cllonee博士使用的的利用串串行化來來進(jìn)行深深cloone,但但是不能能保證深深cloone得得到的結(jié)結(jié)果是正正確的,這這是因?yàn)闉橛行┎徊荒艽行谢?,比比如說,如如果這個(gè)個(gè)zhaangssan類類它繼承承了一個(gè)個(gè)absstraact claass,或者immpleemennts 一些接接口,而而 ab

54、bstrractt cllasss或接口口有常量量等不能能串行化化的東西西,深cclonne可能能會(huì)失敗敗(deeepCClonne方法法本身沒沒有失敗敗,可是是要訪問問cloone的的對(duì)象的的屬性時(shí)時(shí)可能會(huì)會(huì)失敗?。?8,commpossitee模式理理解compoositte模式式就是把把一些具具有相類似似的接口口的類組組合起來來,提供供一致的的訪問接接口三個(gè)角色1,抽象構(gòu)構(gòu)件coompoonennt2,Leaaf 3,樹枝角角色coompoostiiepubliic iinteerfaace Commponnenttpubliic Commpossitee geetCoompoositt

55、e();publiic vvoidd meehodd1();imporrt jjavaa.unntill.*;publiic cllasss Coompoositte iimpllemeentss Coompoonenntprivaate Vecctorr veectoor_ccom=neww veectoor();publiic Commpossitee geetCoompoositte() retturnn thhis; publiic vvoidd meehodd1()Systeem.oout.priintlln(metthodd1 );Emumeerattionn emmumeerat

56、tionn=veectoor_ccom.eleemennts();whilee(emmumeerattionn.haasMooreEElemmentts() (CCompponeent ) eemummeraatioon.nnexttEleemennt().mmethhod11(); publiic vvoidd addd(CCompponeent commponnentt) vecttor_comm.addd(ccompponeent); publiic vvoidd reemovve(CCompponeent commponnentt) vecttor_comm.reemovveEllem

57、eent(commponnentt); publiic cclasss LLeaff immpleemennts Coompoonenntpubliic vvoidd meethood1()Systeem.oout.priintlln(metthodd1 );publiic CCompposiite gettCommpossitee()returrn nnulll;9,迭代子子模式理理解/*/publiic aabsttracct cclasss AAggrregaatepubliic IIterratoor ccreaateIIterratoor()returrn nnulll;/*/pub

58、liic iinteerfaace Iteerattor void firrst();void nexxt();booleean isDDonee();Objecct ccurrrenttIteem();/*/publiic cclasss CConccretteAgggreegatte eexteendss Agggreegatteprivaate Objjectt objj=唐僧,孫悟悟空,豬八八戒,沙僧僧,白龍馬馬,妖怪;publiic IIterratoor ccreaateIIterratoor()returrn nnew CooncrreteeIteerattor(thiis);

59、publiic OObjeect gettEleemennt(iint inddex)if(inndexxobbj.llenggth) retuurn objjinndexx; elsee reeturrn nnulll;publiic iint sizze()returrn oobj.lenngthh;/*/publiic cclasss CConccretteItteraatorr immpleemennts Iteerattorprivaate ConncreeteAAggrregaate aggg;privaate intt inndexx=0;privaate intt siize=

60、0;publiic CooncrreteeIteerattor(ConncreeteAAggrregaate aggg)this.aggg=aggg;this.sizze=aagg.sizze();indexx=0;publiic vvoidd fiirstt()indexx=0;publiic vvoidd neext()if(inndexx=siize);publiic OObjeect currrenntIttem()returrn aagg.gettEleemennt(iindeex);/*/publiic cclasss CClieentprivaate Iteerattor it;

溫馨提示

  • 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)論