JAVA设计模式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1设计模式2本节主要内容Singleton模式Factory模式抽象工厂模式Prototype(原型)Builder模式Adapter示例Composite(组合)Proxy(代理)DecoratorBridgeObserver3Singleton模式应用场景模式形式一publicclassSingleton{privateSingleton(){}privatestaticSingletoninstance=newSingleton();publicstaticSingletongetInstance(){returninstance;}}4Singleton模式模式形式二publicclassSingleton{privatestaticSingletoninstance=null;publicstaticsynchronizedSingletongetInstance(){if(instance==null)instance=newSingleton();returninstance;}}5Factory模式使用场景构建实例时需要进行大量初始化工作接口或基类有多个类似的派生类6Factory模式模式形式publicclassFactory{publicstaticSamplecreator(intwhich){if(which==1)returnnewSampleA();elseif(which==2)returnnewSampleB();}}7抽象工厂模式抽象工厂模式与简单工厂模式的区别在于需要创建对象的复杂程度上抽象工厂模式将Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现假设:Sample有两个实现类SampleA和SamleB,而Sample2也有两个实现类Sample2A和SampleB28抽象工厂模式模式形式publicabstractclassFactory{publicabstractSamplecreator();publicabstractSample2creator(Stringname);}publicclassSimpleFactoryextendsFactory{publicSamplecreator(){.........returnnewSampleA}publicSample2creator(Stringname){.........returnnewSample2A}}9抽象工厂模式publicclassBombFactoryextendsFactory{publicSamplecreator(){......returnnewSampleB}publicSample2creator(Stringname){......returnnewSample2B}}10Prototype(原型)应用场景用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象在Java中Prototype模式变成clone()方法的使用11Prototype(原型)publicabstractclassAbstractSpoonimplementsCloneable{StringspoonName;publicvoidsetSpoonName(StringspoonName){this.spoonName=spoonName;}publicStringgetSpoonName(){returnthis.spoonName;}publicObjectclone(){Objectobject=null;try{object=super.clone();}catch(CloneNotSupportedExceptionexception){System.err.println(AbstractSpoonisnotCloneable);}returnobject;}}12Prototype示例publicclassSoupSpoonextendsAbstractSpoon{publicSoupSpoon(){setSpoonName(SoupSpoon);}}AbstractSpoonspoon=newSoupSpoon();AbstractSpoonspoon2=spoon.clone();13Builder模式应用场景将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示首先假设一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示14Builder示例publicinterfaceBuilder{//创建部件A比如创建汽车车轮voidbuildPartA();//创建部件B比如创建汽车方向盘voidbuildPartB();//创建部件C比如创建汽车发动机voidbuildPartC();//返回最后组装成品结果(返回最后装配好的汽车)//成品的组装过程不在这里进行,而是转移到下面//的Director类中进行。从而实现了解耦过程和部件ProductgetResult();}15Builder示例publicclassDirector{privateBuilderbuilder;publicDirector(Builderbuilder){this.builder=builder;}//将部件partABC最后组成复杂对象的过程publicvoidconstruct(){builder.buildPartA();builder.buildPartB();builder.buildPartC();}}16Builder示例publicclassConcreteBuilderimplementsBuilder{PartpartA,partB,partC;publicvoidbuildPartA(){//这里是具体如何构建partA的代码};publicvoidbuildPartB(){//这里是具体如何构建partB的代码};publicvoidbuildPartC(){//这里是具体如何构建partB的代码};publicProductgetResult(){//返回最后组装成品结果};}17Builder示例ConcreteBuilderbuilder=newConcreteBuilder();Directordirector=newDirector(builder);director.construct();Productproduct=builder.getResult();18Adapter模式应用场景将两个不兼容的类纠合在一起使用属于结构型模式需要有Adaptee(被适配者)和Adaptor(适配器)两个身份19Adapter示例假设有两种类:方形桩圆形桩publicclassSquarePeg{publicvoidinsert(Stringstr){System.out.println(SquarePeginsert():+str);}}publicclassRoundPeg{publicvoidinsertIntohole(Stringmsg){System.out.println(RoundPeginsertIntoHole():+msg);}}20Adapter示例现在有一个应用,需要既打方形桩,又打圆形桩.我们需要将这两个没有关系的类综合应用.假设RoundPeg我们没有源代码,或源代码我们不想修改21Adapter示例publicclassPegAdapterextendsSquarePeg{privateRoundPegroundPeg;publicPegAdapter(RoundPegpeg)(this.roundPeg=peg;)publicvoidinsert(Stringstr){roundPeg.insertIntoHole(str);}}22Adapter思考问题上面的PegAdapter是继承了SquarePeg如果想两边继承,即继承SquarePeg又继承RoundPeg,该如何处理?23Composite(组合)应用场景对象以树形结构组织起来组合体内这些对象都有共同接口当组合体一个对象的方法被调用执行时,Composite将遍历整个树形结构,寻找同样包含这个方法的对象并实现调用执行24Composite示例publicabstractclassEquipment{privateStringname;//网络价格publicabstractdoublenetPrice();//折扣价格publicabstractdoublediscountPrice();//增加部件方法publicbooleanadd(Equipmentequipment){returnfalse;}//删除部件方法publicbooleanremove(Equipmentequipment){returnfalse;}//注意这里,这里就提供一种用于访问组合体类的部件方法。publicIteratoriter(){returnnull;}publicEquipment(finalStringname){this.name=name;}}25Composite示例publicclassDiskextendsEquipment{publicDisk(Stringname){super(name);}//定义Disk网络价格为1publicdoublenetPrice(){return1.;}//定义了disk折扣价格是0.5对折。publicdoublediscountPrice(){return.5;}}26Composite示例Cabinetcabinet=newCabinet(Tower);Chassischassis=newChassis(PCChassis);//将Chassis装到Tower中(将盘盒装到箱子里)cabinet.add(chassis);//将一个硬盘装到Chassis(将硬盘装到盘盒里)chassis.add(newDisk(10GB));//调用netPrice()方法;System.out.println(netPrice=+cabinet.netPrice());27Proxy(代理)应用场景为其他对象提供一种代理以控制对这个对象的访问授权机制不同级别的用户对同一对象拥有不同的访问权利某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动示例参见Proxy.java28Decorator应用场景拓展功能由用户动态决定加入的方式和时机在运行期间决定何时增加何种功能29Decorator示例定义接口publicinterfaceWork{publicvoidinsert();}30Decorator示例接口的实现,完成一件具体工作publicclassSquarePegimplementsWork{publicvoidinsert(){System.out.println(方形桩插入);}}31Bridge应用场景将抽象和行为划分开来,各自独立,但能动态的结合示例Bridge.java32Observer应用场景对于一个事件源,有多个监听者Java的API还为为我们提供现成的Observer接口Java.util.ObserverAlarmObserver.javaWsfAlarmPool.java33小结Singleton模式Factory模式dd抽象工厂模式Prototype(原型)Builder模式Adapter示例Composite(组合)Proxy(代理)DecoratorBridgeObserver

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功