版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Evaluation Warning: The document was created with Spire.Doc for .NET. 设设计模式式的理解解 研研读GOOF的设计模模式和阎宏宏博士的的Jaava 与模式式已经有有一段时时间,自己己颇有一一些体会会,自己己面向对对象和软软件设计计模式有有了一些些深入的的理解,下下面就一一步一步步开始自自己的模模式历程程吧,从从最简单单的工厂厂模式到到适配器器模式,从从 Statte模式式到Deecorratoor模式式,一直直到最复复杂难懂懂的viisittor模模式,没没有一个个模式不不体现了了前辈的的聪明才才智,需需要我们们大家用用心去体
2、体会和理理解 恰当当地使用用设计模模式,能能使软件件系统的的架构更更合理,能能使将来来的维护护和修改改更方便便,能使使数据库库表结构构的设计计更合理理,恰当当的冗余余和数据据关联,能能使我们们的软件件更多地地适应变变化,总总之,它它的的作作用是不不可低估估的!1,简单工工厂,工工厂方法法和抽象象工厂模式式对于简单工工厂来说说,它的的工厂只只能是这这个样子子的publiic cclasss SSimpplyFFacttoryy /* 静态工工厂方法法*/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); 而对产品PProdductt1,PProdductt2,PProdductt3,可以执执行接口口Prooducct,也也可以不不执行接接口Prroduuct(当当然这样样不好),这这个Prroduuct接接口只是是用来抽抽象具体体prooducct用的的publiic iinteerfaace Prooducct voiid pprodducttMetthodd1(); /这这些只是是 voiid pprodducttMetthodd2(); voiid pprodducttMetthodd3();对工厂来说说,只要要有这么么一种产产品,一一般来说说就要在在
5、工厂里里有它的的生产的的方法, 否则抛出异常,而要工厂生产的话,也必须下达生产什么产品的命令,至少要向工厂发出信号,让工厂足以区分是要生产什么产品,否则工厂是不知道生产哪一种产品,对于简单工工厂来说说,就是是需要在在工厂中中枚举所所有的产产品,所所以说简简单工厂厂还是非非常笨的的。 if(whhichh.eqquallIgnnoreeCasse(prooducct1) 只是是用来区区分生产产什么产产品的标标记值,(也也可以根根据产品品其它属属性来判判断,比比如产品品类型,产产品大小小,总之之能够区区分是什什么产品品的属性性,或者者是与产产品属性性相关的的变量)或者说标记值是A,生产A产品,或者
6、工厂里定义不是这样的,我偏偏要生产B产品,或者再特殊一些,我偏偏要生产A产品+B产品,那么就要return new ProductA()+new ProductB()了。这样,我们们就可以以看出一一个问题题来,如如果要能能够被简简单工厂厂生产出出来,就就必须在在简单工工厂中有有能够生生产出的的它的方方法定义义,当然然还需要要有这个个具体产产品类的的定义,就就是有cclasss对应应,这样样确保在在简单工工厂中nnew 它的时时候不会会抛出 NoSSuchhProoducct的Exccepttionn.对于工厂方方法来说说实质上它是是让工厂厂实现了了抽象的的工厂接接口,它它把具体体怎么生生产一种
7、种东西,放放在具体体的工厂厂去实现现了,所所谓”延迟到到子类中中实现“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(); 请注意:返返回类型型是Prroduuct型型的!这样客户端端调用是是直接nnew 一个具具体工厂厂的实例例,然后后命令它它去生产产,而对对于具体体工厂的的父类(既既工厂接接口,接接口完全全可以改改成子类类继承父父类来实实现,只只是这样样不好,不不符合OOO的原原则),它它完全不不知道什什么产品品被生产产了,甚甚至它连连那个具具体工厂厂被实例例化它都都不知道道抽象工厂模模式 抽象工厂模模式主要要是用来来解决具具体产品品是有几几类产品品簇的问问题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() 实际上是这这样的1,两个工工厂类CConCCreaatorr1,ConnCreeatoor2都都实现了了Creeatoo
12、r接口口2,ProoucttA1,ProoducctA22都实现现了PrroduuctAA接口3,ProoucttB1,ProoducctB22都实现现了PrroduuctBB接口4,ConnCreeatoor1负负责生产产1类型的的产品(包括PrroduuctAA1,ProoducctB11)5,ConnCreeatoor2负负责生产产2类型的的产品(包括PrroduuctAA2,ProoducctB22)6,工厂方方法也有有这样的的特征,也也就是说说Creeatoor不知知道什么么被生产产出来,甚甚至不知知道CoonCrreattor11还是CoonCrreattor22被实例例化了,因因
13、为clliennt高兴兴调那一一个工厂厂,就调调那一个个工厂,就就是说工工厂能生生产什么么,对客客户端是是可见的的。甚至至还有一一种情况况,客户户端高兴兴起来就就生产了了ProoducctA11,我就就不生产产ProoducctA22,因为为上面的的例子中中它们还还都是松松散的,没没有绑定定在一起起于是提出另另外一个个例子,也也是老提提起的电电脑类型型的例子子1,电脑生生产商是是接口,2,CUPP是接口口,3,硬盘是是接口,4,IBMM工厂是是制造IIBM品品牌的电电脑的工工厂5,DELLL工厂厂是制造造DElll品牌牌的电脑脑的工厂厂为讨论方便便,就认认为电脑脑=CUUP+硬硬盘;6,所以呀
14、呀CUPP有IBMM的CPUU和DELLL的CPUU7,同样硬硬盘也是是有IBBM的硬硬盘和DDELLL的硬盘盘8,IBMM工厂生生产IBBM的CPUU和IBMM的硬盘盘,绝对对不生产产DELLL的CPUU,也不不生产DDELLL的硬盘盘9,同样DDELLL工厂也也是一样样publiic iinteerfaace 电脑脑生产商商 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 电脑生生产商
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电脑失失败!); 这样,客户户端无法法通过命命令单生生产出一一个CPPU来,这这样抽象象才真正正成为一一个完整整产品的的工厂,只只要向工工厂发出出生产的的命令,一一台完整整的电脑脑就生产产出来了了,而工工厂怎么么生产的的,生产产了哪些些部件,外外界就看看不见了了,外界界就知道道这个工工厂是生生产IBBM电脑脑整机的的工厂!DELL电电脑工厂厂一样/* 下面面来改错
18、错, 请指出出下面片片段的错错误*/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() 思考:上面面的代码码错在哪哪?/* 改错错结束 */2,buiildeer模式式的理解解作者:罗鹏鹏 EEmaiil:lluoppenggecc.coom.ccn简单地说,就就好象我我要一座座房子住住,可是是我不知知道怎么么盖(简简单的砌砌墙,层层次较低低),也也不知道道怎么样样设计(建建几个房房间,几几个门好好看,层层次较高高),于是我我需要找找一帮民民工,他他们会砌砌墙,还还得找个个设计师师,他知知道怎么么设计,我我还要确确保民工工听设计
20、计师的领领导,而而设计师师本身也也不干脏脏活,重重活,光光是下命命令,这这里砌一一堵墙,这这里砌一一扇门,这这样民工工开始建建设,最最后,我我可以向向民工要要房子了了。在这这个过程程中,设设计师是是什么也也没有,除除了他在在脑子里里的设计计和命令令,所以以要房子子也是跟跟民工要要,记住住了!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) /这些下下等人没没有知识识,没有有文化,哈哈哈,得得听我的的 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(我运行行在wiindoow上); pubblicc vooid runn1() Sysstemm.ouut.pprinnt(我运行行在wiindoow上的的runn1方法法); publlic cllasss liinuxx的软件件 pubblicc vooid ru
26、nn() Sysstemm.ouut.pprinnt(我运行行在liinuxx上); publlic cllasss 适配器器 exxtennds wiindoow的软软件 privvatee llinuux的软软件 软件1; /实实际上是是聚合的的使用 publlic 适适配器(linnux的的软件 软件变变量) thiis.软软件1= 软件件变量; publlic vooid runn() 软件1.runn(); publlic vooid runn1() Systtem.outt.prrintt(“已经被被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 模式说说的明白白一点,就就是事情情太多,你你一个人人记不住住,找一一个人专专门帮你你记住,用用的时候候去问一一下。就象董事长长和秘书书一样publiic cclasss MManaage publiic
28、 Strringg nnextt_weeek; /下下个星期期的安排排publiic Strringg nn_neext_weeek; /下个星星期的安安排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、主要是用于于状态的的变化,就就象红绿绿灯一样样如何使用sstatte模式式1,要一个个状态管管理类2,状态接接口3,各种子子状态实实现状态态接口Statee模式的的效果 1)它它将与特特定状态态的行为为局部化化,并且且将不同同的行为为分割开开来 2)它它使得状状态转化化显式化化 3)SStatte对象象可以被被共享 staate模模式中谁谁定义状状态转化化? staate模模式中并并没有指指定哪一一个参与与者定义义状态转转换准则则。换句句话说,它它们可以以在Coonteext中中定义,也也可以在在staate子子类自身身指定她她们的后后继状态态以及何何时进行行转换,后后者通常常更灵活活。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(绿绿灯,前前进); 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模式,因因为装饰饰仅改变变对象的的职责而而不改变变它的接接口,而而适配器器将给对对象一个个全新的的接口。2,Commpossitee模式:可以将将装饰视视为一个个退化的的、仅有有一个组组件的
38、组组合。然然而,装装饰仅给给对象添添加一些些额外的的职责它它的目的的不是在在于对象象聚集6,Prooxy模模式publiic iinteerfaace Subbjecctpubliib vvoidd reequeest();publiic RReallSubbjecct iimpllemeentss SSubjjecttpubliic vvoidd reequeest()Systeem.oout.priintlln(正在处处理请求求!);publiic cclasss PProxxy iimpllemeentss SSubjjecttprivaate ReealSSubjjectt reeal
39、SSubjjectt;publiic Prooxy()publiic vvoidd rrequuestt() if(rreallSubbjecct=nulll) /这里里有个单单例 reaalSuubjeect=neww ReealSSubjjectt(); reaalSuubjeect.reqquesst(); Sysstemm.ouut.pprinntlnn(哈哈哈,是是我在处处理!); publiic cclasss CClieentpubliic sstattic voiid mmainn(Sttrinng aargss)Subjeect subbjecct=nnew Prooxy()
40、;subjeect.reqquesst(); /客户端端没有看看出来,实实际上客客户端发发出的请请求,是是Prooxy在在处理/正常的的没有采采用代理理的话,代代码是这这个样子子的/*Subjeect subbjecct=nnew ReaalSuubjeect();subjeect.reqquesst(); */*思考考题*/Proxyy模式publiic iinteerfaace Subbjecctpubliib vvoidd reequeest();publiic RReallSubbjecct iimpllemeentss SSubjjecttpubliic vvoidd reequee
41、st()Systeem.oout.priintlln(正在处处理请求求!);publiic cclasss PProxxy iimpllemeentss SSubjjecttprivaate ReealSSubjjectt reealSSubjjectt;publiic Prooxy()publiic vvoidd rrequuestt() if(rreallSubbjecct=nulll) /这里里有个单单例 reaalSuubjeect=neww ReealSSubjjectt(); reaalSuubjeect.reqquesst(); Sysstemm.ouut.pprinntlnn(
42、哈哈哈,是是我在处处理!); publiic cclasss CClieentpubliic sstattic voiid mmainn(Sttrinng aargss)Subjeect subbjecct=nnew Prooxy();subjeect.reqquesst(); /客户端端没有看看出来,实实际上客客户端发发出的请请求,是是Prooxy在在处理/正常的的没有采采用代理理的话,代代码是这这个样子子的/*Subjeect subbjecct=nnew ReaalSuubjeect();subjeect.reqquesst(); */7,Prootyppe模式式理解比如说有个个叫张三三
43、的一个个人可以以复制,呵呵呵,他他还有一一本书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博士使用的的利用串串行化来来进行深深cloone,但但是不能能保证深深cloone得得到的结结果是正正确的,这这是因为为有些不不能串行行化的,比比如说,如如果这个个zhaangssan类类它继承承了一个个absstraact claass,或者immpleemennts 一些接接口,而而 ab
54、bstrractt cllasss或接口口有常量量等不能能串行化化的东西西,深cclonne可能能会失败败(deeepCClonne方法法本身没没有失败败,可是是要访问问cloone的的对象的的属性时时可能会会失败!) 8,commpossitee模式理理解compoositte模式式就是把把一些具具有相类似似的接口口的类组组合起来来,提供供一致的的访问接接口三个角色1,抽象构构件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等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安徽绿海商务职业学院单招(计算机)考试备考题库附答案
- 佛山市顺德区勒流新球初级中学2025年英语临聘教师招聘参考题库附答案
- 2025年重庆对外经贸学院单招(计算机)考试备考题库附答案
- 2026年红河卫生职业学院单招(计算机)测试备考题库附答案
- 2026浙江省国贸集团校园招聘备考题库附答案
- 2026年法律法规考试题库及完整答案(夺冠)
- 2026年资料员之资料员基础知识考试题库300道附参考答案【培优】
- 2025年安阳学院单招(计算机)考试备考题库附答案
- 2025广东汕尾市市直单位选调公务员笔试(公共基础知识)综合能力测试题附答案
- 2025四川内江隆昌市住房征收和保障服务中心临聘人员招聘2人考试题库附答案
- 2025年大学森林资源保护(森林防火技术)试题及答案
- 证件租借协议书
- 2026版九上英语人教专题02 完形填空(期末真题必练)(解析版)
- 长春财经学院《大学英语》2023-2024学年第一学期期末试卷
- 2025山东省人民检察院公开招聘聘用制书记员(40名)备考考试题库及答案解析
- 2026届新高考历史冲刺备考复习第一次世界大战与战后国际秩序
- 消防设施操作员基础知识
- 2025天津大学管理岗位集中招聘15人参考笔试题库及答案解析
- T-CAQ 10201-2024《质量管理小组活动准则》解读与实践指南
- 2025年江苏省《保安员资格证考试》考试题库含答案
- 发展心理学-终结性考核-国开(GS)-参考资料
评论
0/150
提交评论