收藏 分享(赏)

jee从入门到精通-第三卷设计模式教程.doc

上传人:dzzj200808 文档编号:3205599 上传时间:2018-10-07 格式:DOC 页数:101 大小:1.64MB
下载 相关 举报
jee从入门到精通-第三卷设计模式教程.doc_第1页
第1页 / 共101页
jee从入门到精通-第三卷设计模式教程.doc_第2页
第2页 / 共101页
jee从入门到精通-第三卷设计模式教程.doc_第3页
第3页 / 共101页
jee从入门到精通-第三卷设计模式教程.doc_第4页
第4页 / 共101页
jee从入门到精通-第三卷设计模式教程.doc_第5页
第5页 / 共101页
点击查看更多>>
资源描述

1、第三卷设计模式程序设计是思维具体化的一种方式,是思考如何解决问题的过程,设计模式是在解决问题的过程中,一些良好思路的经验集成,最早讲设计模式,人们总会提到 Gof 的著作,它最早将经典的 23 种模式集合在一起说明,对后期学习程序设计,尤其是对从事对象导向程序设计的人们起了莫大的影响后来设计模式一词被广泛的应用到各种经验集成,甚至还有反模式(AntiPattern),反模式教导您如何避开一些常犯且似是而非的程序设计思维这边的话将整理一些设计模式学习心得,实作的部份是使用 Java,因而您会看到一些与 Gof 模式不同的图及实作方式,这是为了善用一些 Java 本身的特性 ,至于 C+的实作方面

2、,Gof 的书已经给了不少的例子在一些模式的实作上,您会发现我用了介面(interface)来取代抽象类别(Abstractclass),这与原先的Gof 书中的范例会不尽相同,这是因为在 C+中没有介面,一个完全没有实作任何方法的抽象类别,根据当时描述的主题特性,可以的话会将之换为介面,在语义上会较符合 Java 语言的特性,但是您要知道的是,介面与完全没有实作任何方法的抽象类别在某些时候是可以互换的在这边所看到的 UML 图都是使用 Jude 绘制的,Jude 是一个纯 Java 撰写的 UML 工具程序,可运行与 WindowsLinux 等多个平台,体积小,使用简易Gof 模式以下的设

3、计模式则是我个人从 Gof 学习中的个人体会与实作 ,并增加几个导入或衍生的简单模式Creational 模式对象的产生需要消耗系统资源,所以如何有效率的产生管理与操作对象,一直都是值得讨论的课题,Creational 模式即与对象的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向SimpleFactory 模式AbstractFactory 模式Builder 模式FactoryMethod 模式Prototype 模式Singleton 模式RegistryofSingleton 模式Structural 模式如何设计对象之间的静态结构,如何完成对象之间的继承实现与依赖关系,这关

4、乎着系统设计出来是否健壮(robust):像是易懂 易维护易修改 耦合度低等等议题Structural 模式正如其名,其分类下的模式给出了在不同场合下所适用的各种对象关系结构DefaultAdapter 模式Adapter 模式-ObjectAdapterAdapter 模式-ClassAdapterBridge 模式Composite 模式Decorator 模式Facade 模式Flyweight 模式Proxy 模式 (一)Proxy 模式 (二)Behavioral 模式对象之间的合作行为构成了程序最终的行为,对象之间若有设计良好的行为互动,不仅使得程序执行时更有效率,更可以让对象的职

5、责更为清晰整个程序的动态结构( 像是对象调度)更有弹性ChainofResponsibility 模式Command 模式Interpreter 模式Iterator 模式Mediator 模式Memento 模式Observer 模式State 模式Strategy 模式TemplateMethod 模式Visitor 模式多执行绪模式在很多应用中都会使用多执行绪,尤其是在 Web 应用中,多执行绪以 Gof 整理的模式为基础,考量多执行绪环境中,如何组合这些基本模式来完成多执行绪安全要求GuardedSuspension 模式ProducerConsumer 模式WorkerThread

6、模式Thread-Per-Message 模式Future 模式Read-Write-Lock 模式Two-phaseTermination 模式Thread-SpecificStorage 模式参考资料以下是以 Java 实作设计模式的介绍网站,从下面的连结开始 ,当中您可以找到更多设计模式的资源HustonDesignPatternTheDesignPatternsJavaCompanion板桥里人的 Java 设计模式学习心得UML 软件工程组织28.Creational 模式对象的产生需要消耗系统资源,所以如何有效率的产生管理与操作对象,一直都是值得讨论的课题,Creational 模

7、式即与对象的建立相关,在这个分类下的模式给出了一些指导原则及设计的方向28.1SimpleFactory 模式SimpleFactory 模式(又称 StaticFactory 模式),一个 SimpleFactory 生产成品,而对客户端隐藏产品产生的细节,对象如何生成,生成前是否与其它对象建立依赖关系,客户端皆不用理会,用以将对象生成方式之变化与客户端程序码隔离实作时定义一个产品介面(interface),并透过特定静态方法来建立成品假设有一个音乐盒工厂,购买音乐盒的客人不用知道音乐盒是如何制作的,他只要知道如何播放音乐盒就可以了,以 UML 类别图来表示以上的概念 :如上图所示的,Mus

8、icBoxDemo 代表了客户的角色,它只依赖于 IMusicBox 介面,而不关心特定的实作,实际如何产生 IMusicBox 的实例由 MusicBoxFactory 完成,以一个简单的程序来实现上面这个UML 类别图:IMusicBox.javapublicinterfaceIMusicBoxpublicvoidplay();PianoBox.javapublicclassPianoBoximplementsIMusicBoxpublicvoidplay()System.out.println(“拨放钢琴音乐:)“);ViolinBox.javapublicclassViolinBoxi

9、mplementsIMusicBoxpublicvoidplay()System.out.println(“拨放小提琴音乐_“);MusicBoxFactory.javapublicclassMusicBoxFactorypublicstaticIMusicBoxcreateMusicBox(Stringname)throwsInstantiationException,IllegalAccessException,ClassNotFoundException/这边使用的是 Java 的 Reflection 机制来产生实例/不过客户端不用管啦/以后就算改变了这边的程序,客户端程序是不用更改的

10、IMusicBoxbox=(IMusicBox)Class.forName(name).newInstance()/也许您还会作一些对 box 的属性设定之类的处理/.returnbox;MusicBoxDemo.javapublicclassMusicBoxDemopublicstaticvoidmain(Stringargs)throwsExceptionplayMusicBox(MusicBoxFactory.createMusicBox(“PianoBox“);playMusicBox(MusicBoxFactory.createMusicBox(“ViolinBox“);public

11、staticvoidplayMusicBox(IMusicBoxmusicBox)musicBox.play();由于客户端只依赖于 IMusicBox 介面,所以即使您日后改变了 createMusicBox()中的实作方式,对客户端是一点影响也没有的,白话来说,音乐盒制作方式会因技术进步而变,但不影响客户如何操作音乐盒,因为客户只要知道操作介面即可来看看 SimpleFactory 的类别结构 :客户只要面对 Factory,客户依赖于产品介面,产品的具体实作是可以与客户隔开的,它们也是可以抽换的将 SimpleFactory 的概念扩充 ,可以设计出各种对象皆通用的 Factory 类别

12、,作为用来专门生成组装管理对象的容器28.2AbstractFactory 模式假设您要制作一个对话方块(Dialog)元件,您希望的是这个对话方块可以有不同的视感 (Look-and-feel),最基本的想法是,藉由 Setter 将不同视感的元件设定给这个对话方块,例如:CustomDialog.javapublicclassCustomDialogprivateIButtonbutton;privateITextFieldtextField;publicvoidsetButton(IButtonbutton)this.button=button;publicvoidsetTextFiel

13、d(ITextFieldtextField)this.textField=textField;publicvoidlayoutAllComponents()/publicvoidshowDialog()this.paintDialog();button.paintButton();textField.paintTextField();publicvoidpaintDialog()System.out.println(“customdialogpaints“);很简单,这是最基本的介面依赖,Setter 依赖于 IButton 与 ITextField 两个介面,而不是其实作类别,不过这边还有个

14、进一步的要求,使用上面的方式还必须亲自呼叫 Setterlayout 等方法,您希望视感的更换可以更简单些,例如只要透一个元件的替换就可以完成对话方块上所有元件的视感更换您可以使用 AbstractFactory 模式 ,将所有对话方块所需要的产生的元件加以封装 ,对话方块依赖于 AbstractFactory,实际上具体的 Factory 实现则分别产生对话方块所需要的视感元件,下面的 UML类别图展现这种概念现在如果要更换所有的视感元件,就只要抽象掉具体的 Factory 就可以了,例如:CustomDialogwindowsDialog=newCustomDialog(newWindow

15、sWidgetFactory();windowsDialog.showDialog();CustomDialogmacDialog=newCustomDialog(newMacWidgetFactory();macDialog.showDialog();来将上面的 UML 图具体实现出来 CustomDialog.javapublicclassCustomDialogprivateIButtonbutton;privateITextFieldtextField;publicCustomDialog(IWidgetFactorywidgetFactory)setWidgetFactory(wid

16、getFactory);/由于客户端只依赖于抽象的工厂,工厂如何实作并无关客户端的事/要抽换工厂并不需要改动客户端的程序publicvoidsetWidgetFactory(IWidgetFactorywidgetFactory)setButton(widgetFactory.createButton();setTextField(widgetFactory.createTextField();/publicvoidlayoutAllComponents()/layoutallcomponents/这边也是依赖抽象,实际改变了元件实例/客户端代码也不用更改publicvoidsetButton

17、(IButtonbutton)this.button=button;publicvoidsetTextField(ITextFieldtextField)this.textField=textField;publicvoidshowDialog()this.paintDialog();button.paintButton();textField.paintTextField();publicvoidpaintDialog()System.out.println(“customdialogpaints“);IButton.javapublicinterfaceIButtonpublicvoidp

18、aintButton();ITextField.javapublicinterfaceITextFieldpublicvoidpaintTextField();IWidgetFactory.javapublicinterfaceIWidgetFactorypublicIButtoncreateButton();publicITextFieldcreateTextField();MacButton.javapublicclassMacButtonimplementsIButtonpublicvoidpaintButton()System.out.println(“Macbuttonpaints“

19、);WindowsButton.javapublicclassWindowsButtonimplementsIButtonpublicvoidpaintButton()System.out.println(“Windowsbuttonpaints“);MacTextField.javapublicclassMacTextFieldimplementsITextFieldpublicvoidpaintTextField()System.out.println(“MactextFieldpaints“);WindowsTextField.javapublicclassWindowsTextFiel

20、dimplementsITextFieldpublicvoidpaintTextField()System.out.println(“WindowstextFieldpaints“);MacWidgetFactory.javapublicclassMacWidgetFactoryimplementsIWidgetFactorypublicIButtoncreateButton()returnnewMacButton();publicITextFieldcreateTextField()returnnewMacTextField();WindowsWidgetFactory.javapublic

21、classWindowsWidgetFactoryimplementsIWidgetFactorypublicIButtoncreateButton()returnnewWindowsButton();publicITextFieldcreateTextField()returnnewWindowsTextField();下图是 AbstractFactory 模式的 UML 结构图:简单的说,在 AbstractFactory 模式中将具体的 Product 封装在具体 Factory 实现中,而客户仍只要面对Factory 与 Product 的抽象介面,避免依赖于具体的 Factory

22、与 Product,由于 Factory 封装了所必须的Product,所以要更换掉所有的元件,只要简单的抽换掉 Factory 就可以了,不用修改客户端的程序28.3Builder 模式您想要建立一个迷宫产生程序,迷宫使用二维阵列来定义,0 表示道路,1 表示墙,2 表示宝物,根据所定义的二维迷宫阵列,您想要程序自动产生各种不同材质的迷宫,例如砖墙迷宫,钻石迷宫等等您可以在程序中定义两个角色,一个是指导迷宫建立的 Director 角色,一个是按照指导者指示建立迷宫的 Builder 角色,Director 根据定义的迷宫阵列来指导 Builder,只要更换 Builder,就可以完成不同材

23、质的迷宫可以使用下面的 UML 类别图来表示上述的概念 :实际上的程序设计如下:MazeDirector.javapublicclassMazeDirectorprivateintmaze;privateIMazeBuildermazeBuilder;publicvoidsetMaze(intmaze)this.maze=maze;publicvoidsetMazeBuilder(IMazeBuildermazeBuilder)this.mazeBuilder=mazeBuilder;publicvoidbuildMaze()for(inti=0;imaze.length;i+)for(int

24、j=0;jmazei.length;j+)/由于 mazeBuilder 是 IMazeBuilder 型态/所以无论 Builder 实例为何, 这边的程序都无需变动switch(mazeij)case0:mazeBuilder.createRoadBlock();break;case1:mazeBuilder.createWallBlock();break;case2:mazeBuilder.createTreasureBlock();break;default:System.out.println(“undefined“);mazeBuilder.nextRow();IMazeBuild

25、er.javapublicinterfaceIMazeBuilderpublicvoidcreateRoadBlock();publicvoidcreateWallBlock();publicvoidcreateTreasureBlock();publicvoidnextRow();SoliderMazeBuilder.javapublicclassSolidMazeBuilderimplementsIMazeBuilderpublicvoidcreateWallBlock()System.out.print(“);publicvoidcreateRoadBlock()System.out.p

26、rint(“ “);publicvoidcreateTreasureBlock()System.out.print(“$“);publicvoidnextRow()System.out.println();DiamondMazeBuilder.javapublicclassDiamondMazeBuilderimplementsIMazeBuilderpublicvoidcreateWallBlock()System.out.print(“);publicvoidcreateRoadBlock()System.out.print(“ “);publicvoidcreateTreasureBlo

27、ck()System.out.print(“*“);publicvoidnextRow()System.out.println();使用下面的程序来测试一下,它将产生两个迷宫图形:publicclassMainpublicstaticvoidmain(Stringargs)intmaze=1,1,1,1,1,1,1,1,0,0,0,0,2,1,1,0,1,0,1,0,1,1,0,2,1,0,1,1,1,1,0,1,0,1,1,1,0,0,2,0,0,1,1,1,1,1,1,1,1;MazeDirectormazeDirector=newMazeDirector();mazeDirector.s

28、etMaze(maze);System.out.println(“BuildSolidMaze“);mazeDirector.setMazeBuilder(newSolidMazeBuilder();mazeDirector.buildMaze();System.out.println(“BuildDiamondMaze“);mazeDirector.setMazeBuilder(newDiamondMazeBuilder();mazeDirector.buildMaze();在迷宫例子中并没有产生或返回产品对象,这视您的需求而定,迷宫例子只是将结果输出至主控台,您也可以设计一个产品对象,或是

29、将结果直接输出为文件在 Gof 中有给出了一个不错的例子,以设计文件剖析器为例,该剖析器可以将文件转换为其它的格式,以 DOC 文件剖析器为例好了,假设希望析剖器可以将 DOC 文件转换为 RTF 或是 PDF 文件,可以如下设计结构:简单来说,建筑者模式适用的场合,在于使得您可以依赖抽象的建筑蓝图,而实际建造时可以使用不同的实例,这是其之所以命为 Builder 的原因28.4FactoryMethod 模式考虑一个状况,您所经营的工厂正在生产一个新的电视机产品,现在有一个问题发生了,您的电视机产品所有的组件都可以自行生产,像是操作面版电源 摇控装置等等等 ,但荧幕却必须依赖另一个厂商或子厂

30、商供应,这时您怎么办?您不能将生产进度停下了,相反的您必须确定一些事情,您知道有关于荧幕控制的所有介面,您可以将这些对介面的操作沟通先实现,等到荧幕到了,直接将荧幕与您的半成品组合起来,一个完整的成品即可出厂FactoryMethod 模式在一个抽象类中留下某个创建元件的抽象方法没有实作,其它与元件操作相关联的方法都先依赖于元件所定义的介面,而不是依赖于元件的实现,当您的成品中有一个或多个元件无法确定时,您先确定与这些元件的操作介面,然后用元件的抽象操作介面先完成其它的工作,元件的实作( 实现) 则推迟至实现元件介面的子类完成,一旦元件加入 ,即可完成您的成品再举一个例子,假设您要完成一个文件

31、编辑器,您希望这个编辑器可以适用于所有类型的档案编辑,例如 RTFDOCTXT 等等,尽管这些文件有着不同的格式 ,您先确定的是这些文件必然具备的一些操作介面,例如储存开启 关闭等等 ,您用一个 IDocument 类型来进行操作,这么一来这个框架就无需考虑实际的储存开启等细节是如何进行的 以 UML 类别图来表现以下的概念 :AbstractEditor 中的 createDocument()方法是个抽象方法,因为框架不知道您将实现一个什么类型的文件,这个抽象方法将推迟至继承 AbstractEditor 的子类中实现 这个架构可用以下简单的示意程序来作示范,当中实现了一个 RTFDocum

32、ent,虽然在AbstractEditor 中并不知道我们会套用这个 RTFDocument,但您可以看到,透过多型操作,您的框架可以进行对文件的相关操作AbstractEditor.javapublicabstractclassAbstractEditorprivateIDocumentdocument;publicabstractIDocumentcreateDocument();publicvoidnewDocument()document=createDocument();document.open();publicvoidsaveDocument()if(document!=null

33、)document.save();publicvoidcloseDocument()if(document!=null)document.close();IDocument.javapublicinterfaceIDocumentpublicvoidopen();publicvoidsave();publicvoidclose();RTFEditor.javapublicclassRTFEditorextendsAbstractEditorpublicIDocumentcreateDocument()returnnewRTFDocument();RTFDocument.javapubliccl

34、assRTFDocumentimplementsIDocumentpublicRTFDocument()System.out.println(“建立 RTF 文件“);publicvoidopen()System.out.println(“开启文件“);publicvoidsave()System.out.println(“储存文件“);publicvoidclose()System.out.println(“关闭文件“);将 FactoryMethod 的结构绘出如下:FactoryMethod 中的 AbstractOperator 中拥有一个抽象的 factoryMethod()方法,它

35、负责生成一个IProduct 类型的对象,由于目前还不知道将如何实现这个类型,所以将之推迟至子类别中实现,在AbstractOperator 中先实现 IProduct 操作介面沟通的部份, 只要介面统一了,利用多型操作即可完成各种不同的 IProduct 类型之对象操作也就是说,对 AbstractOperator 来说,其操作的 IProduct 是可以抽换的 28.5Prototype 模式您从图书馆的期刊从发现了几篇您感兴趣的文章,由于这是图书馆的书,您不可以直接在书中作记号或写字,所以您将当中您所感兴趣的几个主题影印出来,这下子您就可在影印的文章上画记重点Prototype 模式的作

36、用有些类似上面的描述,您在父类别中定义一个 clone()方法,而在子类别中重新定义它,当客户端对于所产生的对象有兴趣并想加以利用,而您又不想破坏原来的对象,您可以产生一个对象的复本给它Prototype 具有展示的意味,就像是展览会上的原型车款,当您对某个车款感兴趣时,您可以购买相同款示的车,而不是车展上的车在软体设计上的例子会更清楚的说明为何要进行对象复制,假设您要设计一个室内设计软体,软体中有一个展示家具的工具列,您只要点选工具列就可以产生一个家具复本,例如一张椅子或桌子,您可以拖曳这个复制的对象至设计图中,随时改变它的位置 颜色等等,当您改变设计图中的对象时,工具列上的原型工具列是不会

37、跟着一起改变的,这个道理是无需解释的下面的 UML 类别图表示了上述的简单概念 :Prototype 模式的重点在于 clone(),它负责复制对象本身并传回,但这个 clone()本身在实作上存在一些困难,尤其是当对象本身又继承另一个对象时,如何确保复制的对象完整无误,在不同的程序语言中有不同的作法在 Java 中的作法是透过实作一个 Cloneable 介面,它只是一个声明的介面,并无规定任何实作的方法,您的目的是改写 Object 的 clone()方法,使其具备有复制对象的功能,这个方面建议您参考:Howtoavoidtrapsandcorrectlyoverridemethodsfr

38、omjava.lang.Object用一个简单的例子来实作上图中的结构,这个例子利用了 Java 语言本身的 clone 特性:AbstractFurniture.javapublicabstractclassAbstractFurnitureimplementsCloneablepublicabstractvoiddraw();/在 DesignPattern 上,以下的 clone 是抽象未实作的/实际上在 Java 中 class 都继承自 Object/所以在这边我们直接重新定义 clone()/这是为了符合 Java 现行的 clone 机制protectedObjectclone(

39、)throwsCloneNotSupportedExceptionreturnsuper.clone();CircleTable 与 SquareTable 继承了 AbstractFurniture,并实作 clone 方法,用于传回本身的复制品:CircleTable.javaimportjava.awt.*;publicclassCircleTableextendsAbstractFurnitureprotectedPointcenter;publicvoidsetCenter(Pointcenter)this.center=center;protectedObjectclone()th

40、rowsCloneNotSupportedExceptionObjecto=super.clone();if(this.center!=null)(CircleTable)o).center=(Point)center.clone();returno;publicvoiddraw()System.out.println(“t 圆桌t 中心:(“+center.getX()+“,“+center.getY()+“)“);SquareTable.javaimportjava.awt.*;publicclassSquareTableextendsAbstractFurnitureprotectedR

41、ectanglerectangle;publicvoidsetRectangle(Rectanglerectangle)this.rectangle=rectangle;protectedObjectclone()throwsCloneNotSupportedExceptionObjecto=super.clone();if(this.rectangle!=null)(SquareTable)o).rectangle=(Rectangle)rectangle.clone();returno;publicvoiddraw()System.out.print(“t 方桌t 位置:(“+rectan

42、gle.getX()+“,“+rectangle.getY()+“)“);System.out.println(“/宽高:(“+rectangle.getWidth()+“,“+rectangle.getHeight()+“)“);House 是个虚拟的房屋对象,从 Prototype 复制出来的对象加入至 House 中:House.javaimportjava.util.*;publicclassHouseprivateVectorvector;publicHouse()vector=newVector();publicvoidaddFurniture(AbstractFurnituref

43、urniture)vector.addElement(furniture);System.out.println(“现有家具“);Enumerationenumeration=vector.elements();while(enumeration.hasMoreElements()AbstractFurnituref=(AbstractFurniture)enumeration.nextElement();f.draw();System.out.println();再来是应用程序本身:Application.javaimportjava.awt.*;publicclassApplication

44、privateAbstractFurniturecircleTablePrototype;publicvoidsetCircleTablePrototype(AbstractFurniturecircleTablePrototype)this.circleTablePrototype=circleTablePrototype;publicvoidrunAppExample()throwsExceptionHousehouse=newHouse();CircleTablecircleTable=null;/从工具列选择一个家具加入房子中circleTable=(CircleTable)circl

45、eTablePrototype.clone();circleTable.setCenter(newPoint(10,10);house.addFurniture(circleTable);/从工具列选择一个家具加入房子中circleTable=(CircleTable)circleTablePrototype.clone();circleTable.setCenter(newPoint(20,30);house.addFurniture(circleTable);publicstaticvoidmain(Stringargs)throwsExceptionApplicationapplicat

46、ion=newApplication();application.setCircleTablePrototype(newCircleTable();application.runAppExample();Java 中的 clone()方法是继承自 Object,AbstractFurniture 的子类别则 override 这个 clone()方法,以复制其本身并传回下图为 Prototype 模式的类别结构图:在 Gof 的设计模式书中给出一个原型模式的应用:一个通用的图型编辑器 Framework在这个Framework 中有一个工具列,您可以在上面选择音乐符号以加入乐谱中,并可以随时调

47、整音乐符号的位置等等图型编辑器 Framework 是通用的 ,然而它并不知道这些音乐符号的型态,有人或许会想到继承图型编辑器 Framework 来为每个音乐符号设计一个框架子类别,但由于音乐符号的种类很多,这会产生相当多的子类别,为了避免这种情况,可以透过 Prototype 模式来减少子类别的数目,可以设计出以下的结构:依照这个结构,图型编辑器的 Framework 可以独立于要套用的特定类别之外,虽然不知道被复制传回的对象型态是什么,但总可以按照 Graphics 所定义的介面来操作这些对象28.6Singleton 模式Singleton 的英文意义是独身,也就是只有一个人,应用在对

48、象导向语言上,通常翻译作单例:单一个实例(Instance)很多时候,您会需要 Singleton 模式,例如印表机管理,您希望程序中只能有一个 PrintSpooler,以避免两个列印动作同时输入至印表机中;例如资料库管理,因为建立连接(Connection)对象会耗用资源,您希望程序中只能有一个连接对象,所有其它的程序都透过这个对象来连接资料库,以避免连接对象的重复开启造成资源的耗用;例如系统程序属性档的读取 ,您使用单一个对象来读取属性内容,而程序的其它部份都向这个对象要求属性资料,而不是自行读取属性资料以印表机设计为例,有的设计人员会采取全域变数的方式来建立实例,并在程序中随机取用这个实例,Java 虽然不支援全域变数,但透过将对象包装在一个类别之中 ,也有人会采用这样的写法:publicclassPrintSpoolerpublicPrintSpooler()/publicConnectiongetSpooler()publicclassGlobalObjectprivatePrintSpoolerprintSpooler;publicGlobalObject()printSpooler=newPrintSpooler();.publicvoidgetPrintSpooler(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报