《尚学堂Java培训设计模式及实例.doc》由会员分享,可在线阅读,更多相关《尚学堂Java培训设计模式及实例.doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、北京尚学堂提供生产模式1.工厂方法模式(Factory Method)将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到具体的子类。大大提高了系统扩展的柔性,接口的抽象化处理给相互依赖的对象创建提供了最好的抽象模式。javaview plaincopy1. publicclassTestFactoryMethod2. publicstaticvoidmain(Stringargs)3. AnimalFactoryaf=newDogFactory();4. 5. Animal1a=af.getAnimal();6. 7. 8. abstractclassAnimal
2、19. 10. classDog1extendsAnimal111. 12. classCat1extendsAnimal113. 14. 15. 16. abstractclassAnimalFactory17. 18. publicabstractAnimal1getAnimal();19. 20. classDogFactoryextendsAnimalFactory21. publicAnimal1getAnimal()22. System.out.println(Dog);23. returnnewDog1();24. 25. 26. classCatFactoryextendsAn
3、imalFactory27. publicAnimal1getAnimal()28. System.out.println(Cat);29. returnnewCat1();30. 31. 2.抽象工厂模式(Abstract Factory)针对多个产品等级的情况,而工厂方法模式针对单一产品等级的情况。javaview plaincopy1. importjava.awt.*;2. importjavax.swing.*;3. importjava.awt.event.*;4. publicclassTestAbstractFactory5. publicstaticvoidmain(Stri
4、ngargs)6. GUIFactoryfact=newSwingFactory();7. Framef=fact.getFrame();8. Componentc1=fact.getButton();9. Componentc2=fact.getTextField();10. f.setSize(500,300);11. f.setLayout(newFlowLayout();12. f.add(c1);13. f.add(c2);14. f.setVisible(true);15. f.addWindowListener(newWindowAdapter()16. publicvoidwi
5、ndowClosing(WindowEvente)17. System.exit(0);18. 19. );20. abstractclassGUIFactory21. publicabstractComponentgetButton();22. publicabstractComponentgetTextField();23. publicabstractFramegetFrame();24. 25. classAWTFactoryextendsGUIFactory26. publicComponentgetButton()27. returnnewButton(AWTButton);28.
6、 publicFramegetFrame()returnnewFrame(AWTFrame);publicComponentgetTextField()29. returnnewTextField(20);30. classSwingFactoryextendsGUIFactory31. publicComponentgetButton()32. returnnewJButton(SwingButton);33. 34. publicFramegetFrame()35. returnnewJFrame(SwingFrame);36. publicComponentgetTextField()3
7、7. returnnewJTextField(20);38. 39. 3.单例模式(Singleton)改善全局变量和命名空间的冲突,可以说是一种改良了的全局变量。这种一个类只有一个实例,且提供一个访问全局点的方式,更加灵活的保证了实例的创建和访问约束。系统中只有一个实例,因此构造方法应该为私有 饿汉式:类加载时直接创建静态实例 懒汉式:第一次需要时才创建一个实例,那么newInstance方法要加同步 饿汉式比懒汉式要好,尽管资源利用率要差。但是不用同步。javaview plaincopy1. publicclassTestSingleton2. 3. publicstaticvoidma
8、in(Stringargs)4. 5. 6. classClassA/饿汉式7. 8. privatestaticClassAi=newClassA();9. 10. publicstaticClassAnewInstance()11. 12. returni;13. 14. privateClassA()15. 16. classClassB/懒汉式17. privatestaticClassBi=null;18. publicstaticsynchronizedClassBnewInstance()19. if(i=null)i=newClassB();20. returni;21. 22
9、. privateClassB()23. 4.建造模式(Builder)将一个对象的内部表象和建造过程分割,一个建造过程可以造出不同表象的对象。可简化为模版方法模式.javaview plaincopy1. publicclassTestBuilder2. 3. publicstaticvoidmain(Stringargs)4. 5. Builderb=newBuilderImpl1();6. 7. Directord=newDirector(b);8. 9. Productp=d.createProduct();10. 11. 12. 13. 14. interfaceBuilder15.
10、 voidbuildPart1();16. voidbuildPart2();17. voidbuildPart3();18. ProductgetProduct();19. 20. 21. classBuilderImpl1implementsBuilder22. publicvoidbuildPart1()23. System.out.println(createpart1);24. 25. publicvoidbuildPart2()26. System.out.println(createpart2);27. 28. publicvoidbuildPart3()29. System.o
11、ut.println(createpart3);30. 31. 32. publicProductgetProduct()33. returnnewProduct();34. 35. 36. 37. classDirector38. Builderb;39. publicDirector(Builderb)40. this.b=b;41. 42. publicProductcreateProduct()43. 44. b.buildPart1();b.buildPart2();45. 46. b.buildPart3();47. 48. returnb.getProduct();49. 50.
12、 51. classProduct5.原型模式(ProtoType) 深拷贝:拷贝本对象引用的对象,有可能会出现循环引用的情况。可以用串行化解决深拷贝。写到流里再读出来,这时会是一个对象的深拷贝结果。 浅拷贝:只拷贝简单属性的值和对象属性的地址 通过一个原型对象来创建一个新对象(克隆)。Java中要给出Clonable接口的实现,具体类要实现这个接口,并给出clone()方法的实现细节,这就是简单原型模式的应用。 javaview plaincopy1. importjava.io.*;2. publicclassTestClonealbe3. 4. publicstaticvoidmain(
13、Stringargs)throwsException5. 6. Fatherf=newFather();7. Useru1=newUser(,f);8. 9. Useru2=(User)u1.clone();10. 11. System.out.println(u1=u2);12. 13. System.out.println(u1.f=u2.f);14. 15. 16. classUserimplementsCloneable,Serializable17. Stringpassword;18. Fatherf;19. publicUser(Stringpassword,Fatherf)20
14、. this.password=password;21. this.f=f;22. 23. publicObjectclone()throwsCloneNotSupportedException24. /returnsuper.clone();25. ObjectOutputStreamout=null;26. ObjectInputStreamin=null;27. try28. ByteArrayOutputStreambo=newByteArrayOutputStream();29. out=newObjectOutputStream(bo);30. out.writeObject(th
15、is);31. out.flush();32. bytebs=bo.toByteArray();33. ByteArrayInputStreambi=newByteArrayInputStream(bs);34. in=newObjectInputStream(bi);35. Objecto=in.readObject();36. returno;37. 38. catch(IOExceptione)39. e.printStackTrace();40. returnnull;41. catch(ClassNotFoundExceptione)42. e.printStackTrace();4
16、3. returnnull;44. 45. finally46. try47. out.close();48. in.close();49. catch(IOExceptione)50. e.printStackTrace();51. 52. 53. 54. 55. classFatherimplementsSerializable结构模式如何把简单的类根据某种结构组装为大的系统6.适配器模式(Adapter)在原类型不做任何改变的情况下,用一个适配器类把一个接口转成另一个接口,扩展了新的接口,灵活且多样的适配一切旧俗。这种打破旧框框,适配新格局的思想,是面向对象的精髓。以继承方式实现的类的
17、Adapter模式和以聚合方式实现的对象的Adapter模式,各有千秋,各取所长。javaview plaincopy1. publicclassTestAdapter2. publicstaticvoidmain(Stringargs)3. USBmouse=newMouse();4. PCpc=newPC();5. /pc.useMouse(mouse);6. PS2adapter=newUSB2PS2Adapter(mouse);7. pc.useMouse(adapter);8. 9. 10. interfacePS211. voidusePs2();12. 13. interface
18、USB14. voiduseUsb();15. 16. classMouseimplementsUSB17. publicvoiduseUsb()18. System.out.println(通过USB接口工作);19. 20. 21. classPC22. publicvoiduseMouse(PS2ps2Mouse)23. ps2Mouse.usePs2();24. 25. 26. 27. classUSB2PS2AdapterimplementsPS228. privateUSBusb;29. publicUSB2PS2Adapter(USBusb)30. this.usb=usb;31
19、. 32. publicvoidusePs2()33. System.out.println(把对usePS2的方法调用转换成对useUSB的方法调用);34. usb.useUsb();35. 36. 7.组合模式(Composite)把整体和局部的关系用树状结构描述出来,使得客户端把整体对象和局部对象同等看待。javaview plaincopy1. importjava.util.*;2. 3. publicclassTestComposite4. 5. publicstaticvoidmain(Stringargs)6. 7. Noden1=newLeafNode(3);8. 9. N
20、oden2=newLeafNode(4);10. 11. Noden3=newLeafNode(6);12. 13. Noden4=newLeafNode(5);14. 15. Noden5=newLeafNode(2);16. 17. Noden6=newLeafNode(9);18. Noden7=newLeafNode(12);19. Noden8=newLeafNode(7);20. Noden9=newLeafNode(8);21. Nodec1=newCompositeNode(n1,n2,n3);22. Nodec4=newCompositeNode(n8,n9);23. Nod
21、ec3=newCompositeNode(n5,c4);24. Nodec2=newCompositeNode(n4,c3);25. Nodec5=newCompositeNode(n6,n7);26. Noderoot=newCompositeNode(c1,c2,c5);27. System.out.println(root.getValue();28. 29. 30. abstractclassNode31. publicabstractintgetValue();32. 33. classLeafNodeextendsNode34. intvalue;35. publicLeafNod
22、e(intvalue)36. this.value=value;37. 38. publicintgetValue()39. returnvalue;40. classCompositeNodeextendsNode41. privateListchildren=newArrayList();42. publicCompositeNode(Node.nodes)43. for(Noden:nodes)44. children.add(n);45. publicintgetValue()46. intresult=0;47. for(Noden:children)48. result+=n.ge
23、tValue();49. 50. returnresult;51. 52. 8.装饰模式(Decorator)以对客户透明的方式来扩展对象的功能。 用户根据功能需求随意选取组成对象的成分,通过方法的链式调用来实现。 可以给对象动态的增加功能,比继承灵活性更大。1. publicclassTestDecorator2. 3. publicstaticvoidmain(Stringargs)4. 5. Teachert1=newSimpleTeacher();6. Teachert2=newCppTeacher(t1);7. Teachert3=newJavaTeacher(t2);8. t3.t
24、each();9. /t.teach();10. 11. 12. abstractclassTeacher13. 14. publicabstractvoidteach();15. 16. classSimpleTeacherextendsTeacher17. publicvoidteach()18. System.out.println(GoodGoodStudy,DayDayUp);19. 20. 21. classJavaTeacherextendsTeacher22. Teacherteacher;23. publicJavaTeacher(Teachert)24. this.teac
25、her=t;25. 26. publicvoidteach()27. teacher.teach();28. System.out.println(TeachJava);29. 30. 31. classCppTeacherextendsTeacher32. Teacherteacher;33. 34. publicCppTeacher(Teachert)35. 36. this.teacher=t;37. publicvoidteach()38. teacher.teach();39. System.out.println(TeachC+);40. 41. 9.代理模式(Proxy)用一个代
26、理对象来作为另一个对象的代理,对客户来说是透明的。 存在一个抽象主题类,具体主题类和代理主题类都继承(实现)抽象主题,代理主题类中的方法会调用具体主题类中相对应的方法。10.享元模式(Flyweight Pattern)对象的状态分为内蕴状态和外蕴状态。内蕴状态不随环境变化而变化,因此可以作成系统共享.11.门面模式(Facade)访问子系统的时候,通过一个Faade对象访问。Facade类是单例的。 客户代码只需要和门面对象通信,不需要和具体子系统内部的对象通信,使得他们之间的耦合关系减弱。 这次将表现层和逻辑层隔离,封装底层的复杂处理,为用户提供简单的接口,这样的例子随处可见。门面模式很多
27、时候更是一种系统架构的设计,在我所做的项目中,就实现了门面模式的接口,为复杂系统的解耦提供了最好的解决方案。12.桥梁模式(Bridge)将抽象和实现脱耦,使得二者可以单独变化。使得一个继承关系不承担两个变化因素.使用合成来代替继承的一种体现.1. publicYuanUser(BankAccountaccount)2. super(account);3. 4. publicvoidgetMoney()5. System.out.print(人民币);6. account.withdraw();7. 8. publicvoidsaveMoney()9. System.out.print(人民币
28、);10. account.deposit();11. 12. 13. classDollarUserextendsBankUser14. publicDollarUser(BankAccountaccount)15. super(account);16. 17. publicvoidgetMoney()18. System.out.print(美元);19. account.withdraw();20. 21. publicvoidsaveMoney()22. System.out.print(美元);23. account.deposit();24. 25. 行为模式描述如何在对象之间划分
29、责任13.策略模式(Strategy)如同LayoutManager和具体的布局管理器的关系,在抽象策略类中定义方法,将易于变化的部分封装为接口,通常Strategy 封装一些运算法则,使之能互换。Bruce Zhang在他的博客中提到策略模式其实是一种“面向接口”的编程方法,真是恰如其分。 在具体策略子类中实现,客户代码根据不同的需要选择相应的具体类,例如电子商务中多种价格算法。 一种策略一旦选中,整个系统运行期是不变化的1. publicclassTestStrategy2. publicstaticvoidmain(Stringargs)3. Strategys1=newMay1Stra
30、tegy();4. Strategys2=newJune1Strategy();5. 6. Bookb=newBook(100);7. 8. b.setS(s2);9. 10. System.out.println(b.getPrice();11. classBook12. Strategys;13. publicBook(doubleprice)14. this.price=price;15. privatedoubleprice;16. publicvoidsetS(Strategys)17. this.s=s;18. publicdoublegetPrice()19. returnpri
31、ce*s.getZheKou();20. interfaceStrategy21. doublegetZheKou();22. classMay1StrategyimplementsStrategy23. publicdoublegetZheKou()24. return0.8;25. classJune1StrategyimplementsStrategy26. publicdoublegetZheKou()27. return0.7;14.模板方法(Template Method)准备一个抽象类,把部分确定的逻辑定义在某些方法中,用其他抽象方法实现剩余的逻辑。不同子类对这些逻辑有不同的实现
32、。 用法:定义多个抽象操作,定义并实现一个模板方法,将步骤放在这个具体方法里,推迟到子类实现。子类可以改变父类的可变部分,但不能改变模板方法所代表的顶级逻辑。1. publicclassTestTemplateMethod2. publicstaticvoidmain(Stringargs)3. XiaoPinxp=newDaPuKe();4. xp.act();5. 6. 7. abstractclassXiaoPin8. publicabstractvoidjiaoLiu();9. publicabstractvoidxuShi();10. publicabstractvoidgaoXia
33、o();11. publicabstractvoidshanQing();12. publicfinalvoidact()13. jiaoLiu();14. xuShi();15. gaoXiao();16. shanQing();17. 18. 19. classDaPuKeextendsXiaoPin20. publicvoidjiaoLiu()21. System.out.println(顺口溜);22. 23. publicvoidxuShi()24. System.out.println(火车除夕,老同学见面);25. 26. publicvoidgaoXiao()27. Syste
34、m.out.println(名片当作扑克);28. 29. publicvoidshanQing()30. System.out.println(马家军);31. 32. 15.观察者模式(Observer)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。观察者和被观察者的分开,为模块划分提供了清晰的界限。在低耦合的对象间完成协调。 Java中的事件模型就是一个应用。16.迭代器模式(Iterator)类似于集合中的Iterator,使用迭代器来统一不同集合对象的遍历方式。在绝大多数的系统中,都会用到数组、集合、链表、队列这样的类型,关
35、心迭代模式的来龙去脉非常有必要。在遍历算法中,迭代模式提供了遍历的顺序访问容 器,GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。.NET中就是使用了迭代器来 创建用于foreach的集合。1. publicclassTestIterator2. publicstaticvoidmain(Stringargs)3. Stacks=newStack();4. s.push(Liucy);5. s.push(Huxz);6. s.push(George);7. LinkedListl=newLinkedList();8. l.addF
36、irst(Liucy);9. l.addFirst(Huxz);10. l.addFirst(George);11. print(l.iterator();12. 13. publicstaticvoidprint(Itrit)14. while(it.hasNext()15. System.out.println(it.next();16. 17. 18. 19. interfaceItr20. booleanhasNext();21. Objectnext();22. 23. classStack24. Objectos=newObject10;25. intindex=0;26. pri
37、vatevoidexpand()27. Objectos2=newObjectos.length*2;28. System.arraycopy(os,0,os2,0,os.length);29. os=os2;30. 31. publicvoidpush(Objecto)32. if(index=os.length)expand();33. osindex=o;34. index+;35. 36. publicObjectpop()37. 38. index-;39. 40. Objecto=osindex;41. 42. osindex=null;43. 44. returno;45. 46
38、. privateclassStackItrimplementsItr47. 48. intcursor=0;49. 50. publicbooleanhasNext()51. returncursor52. publicObjectnext()53. 54. returnoscursor+;55. 56. 57. 58. publicItriterator()59. returnnewStackItr();60. classLinkedList61. privateclassNode62. Objecto;63. Nodenext;64. publicNode(Objecto)65. thi
39、s.o=o;66. 67. publicvoidsetNext(Nodenext)68. this.next=next;69. 70. publicNodegetNext()71. returnthis.next;72. 73. Nodehead;74. publicvoidaddFirst(Objecto)75. Noden=newNode(o);76. n.setNext(head);77. 78. head=n;79. 80. 81. publicObjectremoveFirst()82. 83. Noden=head;84. head=head.getNext();85. returnn.o;86. 87. classLinkedListItrimplementsItr88. 89. NodecurrentNode=head;90. 91. publicbooleanhasNext()92. 93. returnthis.cur