常用设计模式java.docx
- 文档编号:3923218
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:15
- 大小:33.85KB
常用设计模式java.docx
《常用设计模式java.docx》由会员分享,可在线阅读,更多相关《常用设计模式java.docx(15页珍藏版)》请在冰豆网上搜索。
常用设计模式java
目录
创建型模式-2-
1.1工厂方法-2-
1.2抽象工厂-3-
1.3建造者模式-4-
1.4单态模式-5-
结构型模式-6-
2.1适配器模式-6-
2.2桥接模式-7-
2.3组合模式-8-
2.4装饰模式-10-
2.5外观模式-11-
2.6享元模式-12-
2.7代理模式-13-
行为型模式-14-
3.1责任链模式-14-
3.2命令模式-15-
3.3解释器模式-16-
3.4迭代器模式-17-
3.5中介者模式-18-
3.6备忘录模式-19-
3.7观察者模式-20-
3.8状态模式-22-
3.9策略模式-22-
3.10模板方法-23-
3.11访问者模式-24-
创建型模式
AbstractFactory(抽象工厂)FactoryMethod(工厂方法)Singleton(单态模式)Builder(建造者模式)Protot*pe*原型模式)
1.1工厂方法
*义一个用于创建对象的接口,让子类决定实例化哪一个类。
FactoryMethod使一个类的实例*延迟到其子类。
适用性1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当*将创建对象的职责委托给多个帮助*类中的某一个,并且*希望将哪一个帮助子类是代理者这一信息局部化的时候。
参与者1.Product定义工厂方法所创建的对象的接口。
2.ConcreteProduct实现Product接口。
3.Creator声明工厂方法,该方法返回一个Product类型的对象*Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
可以调用工厂方法以创建一个Product对象。
4.ConcreteCreator重定义工厂方法以返回一个ConcreteProduct实例。
例子*roductpublicinterfaceWork{voiddoWork();}ConcreteProductpublicclassStudentWorkimplementsWork{publicvoiddoWork(){System.out.println("学生*作业!
");}}publicclassTeacherWorkimplementsWork{publicvoiddoWork(){System.out.println("老师审批作业!
");}}CreatorpublicinterfaceIWorkFactory{Workget*ork();}Concre*eCreatorpu*licclassStudentWorkFactoryimplementsIWorkFactory{4publicWorkgetWork(){*eturnnewStudentWork();}}publicclassTeacherWorkFactoryimplementsIWorkFactory{publicWorkgetWork(){returnnewTeacherWork();}}TestpublicclassTest{publicstaticvoidm*in(Strin*[]args){IWorkFactorystudentWorkFactory=newStudentWorkFactory();studentWorkFactory.getWork().d*Work();IWorkFactoryteacherWorkFactory*newTeacherWorkFactory();teacherWorkFactory.g*tWork().*oWork();}}result
学生做作业!
老师审批作业!
1.2抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性1.一个系统要独立于它的*品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时*4*当你提供一个产品类库,而只想显示它们*接口而不是实现时。
参与者1.Ab*tractFactory声明一个创建抽象产品对象的操作接口。
2.ConcreteFactory实现创建具体产品对象的操作。
*.AbstractProduct为一类产品对象声明一个接口。
4.ConcreteProdu*t定义一个将被相应的具体工厂创建的产品*象。
实现*bstractProduct接口。
5.Client仅使用由AbstractFactory和Ab
stractProduc*类声明的接口例子*bstractFactorypublicinterfaceIAn*malFactory{ICatcreateCat();IDogcre*teDog();}ConcreteFactory6p*blicclassBlackAnimalFactoryimplem*ntsIAnimalFactory{publicICatcreateCat(){retur*newBlackCat();}publicIDogcreateDog(){returnnewBlackDog();}}publicclassWhiteAnimalFac*oryimp*ementsIAnimalFactory{publicICatcreateCat(){returnnewWhiteCat();}publicIDogcre*teDog(){returnnewWhiteDog();}}Abstrac*ProductpublicinterfaceICat{voideat();}publicinterfaceIDog{voideat();}Concrete*roductpublicclassBlack*atimplementsICat{publicvoideat(){System.out.println("Thebl*ckcatiseating!
");}}7publicclassWhiteCatimplements*Cat{publicvoideat(){Sy*tem.out.prin*ln("Thew*itecatiseating!
*);}}publicclassBlackDogimplementsIDog{publicvoideat(){System.out.println("Theblackdogiseating");}}publicclassWhiteDogimplementsIDog{publicvoideat(){System.out.println("Thewhitedogiseat*ng!
");}}Clientpublicstaticvoidmain(String[]args){IAnimalFactoryblackAnimalFa*tory=newBlackAnimalFactory();ICatblackCat=blackAnimalFactory.createCat();blackCat.eat();IDogblackD*g=blackAnimalFactory.createDog();blackDog.eat();IAnimalFactorywhiteAnimalF*ctory=newWhiteAnimalFactory();ICatwhiteCat=whiteAnimalFactory.createCat();whiteCat.eat();IDog*hiteDog=whiteAnimalFactory.createDog();whiteDog.eat();}res*ltThebla*kcatiseating!
Th*blackdogiseatin*!
Thewhitecatiseating!
8Thewhitedogis*ating!
1.3建造者模式
将一个复杂对象的构*与它的表示分离,使*同样的构建过程可以创建不同的表示。
适用性1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
*.当构造过程必须允*被构造的对象有不同*表示时。
参与者1.Builder为创建一个Product对象的各个部件指定抽象接口。
2.ConcreteBuilder实现Buil*er的接口以构造和装配该产品的各个部件。
定义并明确它所创建的表示*提供一个检索产品的接口。
3.Director构造一个使用Builder接口的对象。
4.Product表示被构造的复杂对象。
ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
例子Buil*erpublicinterfacePersonBuilder{voidbuildHead();v*idbuildBody();voidbuildFoot()*PersonbuildPerson();}ConcreteBuilderpublicclassManBuilderimplementsPersonB*ilder{Personperson;publicManBuilder(){person=ne*Man();}publ*cvoidbuild*ody(){perso*.setBody("建造男人的身体");10}public
voidbuildFoot(){person.setFo*t("建造男人的脚");}publicvoidbuildHead(){pers*n.setHead("建造*人的头");}*ublicPersonbuildPerson(){retur*person;}}Dir*ctorpublicclassPersonDirec*or{publicPersonconstructPerson(PersonBuilderpb){pb.buildHead();pb.buildBody();pb.buildFoot();returnpb.buildPerson();}}ProductpublicclassPerson{privateStringhead;privateStringbody;privateStringfoot;publicStringgetH*ad(){returnhead;}publicvoidsetHead(Stringhea*){this.head=head;}publicStringgetBody(){11returnbody;}publicvoidsetBody(Stringbody){this.b*dy=body;}publicStringgetFoot(){returnfoot;}publicvoidsetFoot(Stringfoot){t*is.foot=foot;}}publicclassManextendsPerson{}Testpubl*cclassTest{publicstaticvoidmain(String[]ar*s){PersonDirectorpd=newPersonDirector();Personperson=pd.constructPerson(newManBuilder());System*out.println(person.getBody());System.out.println(person.getFoot());System.out.println(person.getHead());}}result建造男人*身体建造男*的脚建造男人的头
1.4单态模式
保证一个类仅有一个实例,*提供一个访问它的全局访*点。
适用性1.当类只能有一个*例而且客户可以从一个众所周知的访问点访问它时。
122.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
参与者Singleton定义一个Instance操作,允许客户访问它的唯一实例。
Instance是一个类操作。
可能负*创建它自己的唯一实例。
类图例子SingletonpublicclassSingleton{privatestaticSingletonsing;privateSingleton(){}publicst*ticSingletonget*nstance(){if(sing==null){sing=newSingleto*();}returnsing;}}TestpublicclassTest{publicstaticvoid*ain(*tring[]args){Singletonsing=Singleton.getInstance();Singletonsi*g2=Singleton.getI*stance();System.out.println(sing);System.out.pr*ntln(sing2);}}result13singleton.Singleton@1c78e57singleton.Singleton@1c78e571.5原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
适用性1.当一个系统应该独立于它的产品创*、构成和表示时。
2.当要实例化的类是在运行时刻指定时,例如,通过动态装载。
3.为了避免创建一个与产品类层次平行的工厂*层次时。
4.当一个类的实例只能有几个不同状态组合中的一种时。
建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
参与者1.Prototype声明一个克隆自身的接口。
2.ConcretePrototype实现一个克隆自身的操作。
3.Client让一个原型克*自身从而创建一个新的对象。
类图C:
\User
s\fulin\AppData\Local\Temp\404683\images\Prototype.jpg例子Prototype14publicclassPrototypeimplementsCloneable{privateStringname;publicvoidsetName(Stringname){this.name=name;}publicStringgetName(){returnthis.name;}publicObjectclone(){try{returnsuper.clone();}catch(Exceptione){e.printStackTrace();returnnull;}}}ConcretePrototypepubl*cclassConcretePrototypeextend*Prototype{publicConcretePrototype(Stringname){setName(name);}}Clientpublicclas*Test{publicstaticvoidmain(String[]args){Prototypepro=newConcretePrototy*e("prototype");Prototypepro2=(Prototype)pro.clone();*ystem.out.println(pro.getName()*;System.out.println(pro2.getName());}}resultprototype15prototype
结构型模式
Adapter*适配器模式*Bridge(桥接模*)Composite(组合模式)Decorator(装*模式)Facade(外观模式)Flyweight(享元模式)Proxy(代理模式)
2.1适配器模式
将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使得原本由于接口*兼容而不能一起工作的那*类可以一起工作。
适用性1.你想使*一个已经存在的类,而它的接口不符合你的需求。
2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那*接口可能不一定兼容的类)协同工作。
*.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。
对象适配器可以适配它的父类接口。
参与者1.Target定义Client使用的与特定领域相关的接口。
2.Client与符合Target接口的对象协同。
3.Adapt*e定义一个已经存在的接口,这个接口需要适配。
4.Adapter对Adaptee的接口与Target接口进行适配16类图C:
\Users\fulin\AppData\Local\Temp\404683\images\Adapter.jpg例子TargetpublicinterfaceTarget{voidadapteeMethod();voidadapterMethod();}AdapteepublicclassAdaptee{publicvoidadapteeMethod(){Syste*.out.p*intln("Adapteemethod!
");}}Adapt*rpublicclas*Adapterimplement*Target{privateAdap*eeadaptee;publicAdapter(Adapteeadaptee){this.adapte*=adaptee;}publicvoidadapteeMethod(){adaptee.adapteeMethod();}publicvoidadapterMethod(){*ystem.out.println("Adaptermethod!
");}17}Clientpubliccla*sTest{publicstati*voidmain(String[]args){Targettarget=newAdapter(newAdaptee());tar*et.adapteeMethod();target.adapterM*thod();}}resultAdapteemethod!
Adaptermethod!
2.2桥接模式
将抽象部分与它*实现部分分离,使它们都可以独立地变化。
适用性1.你不希望在抽*和它的实现部分之间有一个固定的绑定关系。
例如这种情况
可能是因为,在程序运行时刻实现部分应可以*选择或者切换。
2.类的抽象以及它的实现都应该可以通*生成子类的方法加以扩充。
这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
3.对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
4.正如在意图一节的第一个类图中所示的那样,有许多类要生成。
这*一种类层次结构说明你必须将一个对象分解成两个部分。
5.*想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知*这一点。
参与者1.Abstraction定义抽象类的接口。
18维护一个指向Implementor类型对象的指针。
2.RefinedAbstraction扩充由Abstraction定义的接口。
3.Implementor定义实现类的接口,该接口不一定要与Ab*traction的接口完全一致。
事实上这两个接口可以完全不同。
*般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
4.ConcreteImplementor*现Implementor接口并定义它的具体实现。
类图C:
\Users\fulin\AppData\Local\Temp\404683\images\Bridge.jpg例子Abstr*ctionpublicabstractclassPerson{privateClothingclothing;pr*vateStringtype;publicClothinggetClothing(){returnclothing;}publi*voidsetClothing(){this.clothing=*lothingFactory.getClothing();}19publicvoidsetType(Stringtype){t*is.type=type;}publicStringgetType(){returnthis.ty*e;}publicabstractvoiddress();}RefinedAbstractionpublicclassManextends*erson{publicMan(){setType("男人");}publicvoiddress(){Clothingclothing=get*lothing();clothing.personDressCloth(this);}}publicclassLadyextendsPerson{publicLady(){setTyp*("女人");}publicvoiddress(){Cloth*ngclothing=getClothing();c*othing.personDressCloth(this);}}Implemento*publicabstractclassClothing{publicabstractvoidpersonDressC*oth(*ersonperson);}ConcreteImplemento*publicclass*ack*textendsClothing{20publicvoidpersonDressCloth(Personperson){System.out.println(person.getType()+"穿马甲");}}publiccl*ssTrouserextendsClothing
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常用 设计 模式 java