




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章,结构型模式,课程目标,结构型模式概述Adapter模式Bridge模式Composite模式Decorator模式Faade模式Flyweight模式Proxy模式,体验项目,使用Composite模式来编写如图3-1所示的二叉树,然后使用深度优先搜索法遍历该二叉树,并打印出根节点的高度,运行效果如图3-2所示。,图3-1二叉树图,图3-2二叉树遍历结果图,结构型模式概述,结构型模式是为解决怎样组装现有的类,设计他们的交互方式,从而达到实现一定的功能的目的。同时,结构型模式包容了对很多问题的解决,例如扩展性(外观模式,组成模式,代理模式,装饰模式),封装性(适配器模式,桥接模式)。,结构型模式中解决了以下几个问题:,在不破坏类封装性的基础上,实现新的功能。这一点包括装饰模式,代理模式。,在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行交互。这一点包括桥接和适配器模式。,创建一组类的统一访问接口,这是组成模式。,对同一类创建不同的访问界面,提供给不同需要的访问者,这是外观模式。,Adapter模式,适配器模式有类适配器和对象匹配器两种形式。其中类适配器使用多继承(由于java不支持多继承,所以可以引入接口的概念)来实现一个接口对另一个接口的匹配,对象适配器主要依赖于对象组合来实现接口的匹配。比如java窗体事件处理的事件适配器就是一个很好的例子。,模式介绍,主要适用于以下情况:,使用一个已经存在的类,而它的接口不符合你的需求。,创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。,使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口,仅适用于对象适配器。,Adapter模式结构图,适配器模式结构图如下:,类适配器结构图,对象适配器结构图,Target:定义Client使用的与特定应用或领域相关的接口。,Adaptee:定义一个已经存在的类,该类需要适配。,Adapter:对Adaptee类和Target接口进行适配。Client通过Adapter实例对象来调用某些方法,然后适配器调用Adaptee的方法来实现请求,适配器模式示例,比如我们编写过两个类,分别用于画圆形桩和方形桩,假设现在有一个应用,需要既画方形桩,又要画圆形桩,就可以使用该模式实现。,使用对象适配器模式实现如下:,publicclassDrawRoundpublicvoiddisplayRound(Stringmsg)System.out.println(DrawRounddisplayRound():+msg);publicclassDrawSquarepublicvoiddisplaySquare(Stringstr)System.out.println(DrawSquaredisplaySquare():+str);publicclassShapeAdapterextendsDrawSquareprivateDrawRoundround;publicShapeAdapter(DrawRoundr)this.round=r;publicvoidinsertRound(Stringstr)round.displayRound(str);,使用类适配器模式实现如下:,publicinterfaceDrawRoundInterfacepublicvoiddisplayRound(Stringmsg);publicclassDrawRoundimplementsDrawRoundInterfacepublicvoiddisplayRound(Stringmsg)System.out.println(DrawRounddisplayRound():+msg);publicclassShapeAdapterextendsDrawSquareimplementsDrawRoundInterfaceprivateDrawRoundround;publicShapeAdapter(DrawRoundr)this.round=r;publicvoiddisplayRound(Stringmsg)round.displayRound(msg);/doSomethingpublicclassClientpublicstaticvoidmain(Stringargs)ShapeAdapterd=newShapeAdapter(newDrawRound();d.insertRound(圆形);d.displaySquare(方形);,Adapter模式优势和不足,类适配器的优缺点如下:,用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。,使得Adapter可以重定义Adaptee的部分行为。,对象适配器的优缺点如下:,允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类(如果有子类的话)同时工作。,使得重定义Adaptee的行为比较困难。,仅仅引入了一个对象,并不需要额外的引用(指针)以间接得到Adaptee。,Bridge模式,在面向对象设计的基本概念中,对象这个概念实际上是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,一种抽象的。一般情况下,行为是包含在一个对象中,但是在有些情况下,我们需要将这些行为也进行归类,形成一个总的行为接口,这就是桥接模式的用处。,模式介绍,主要适用于以下情况:,不希望在抽象和它的实现部分之间有一个固定的绑定关系。,类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。,在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。,Bridge模式结构图,桥接模式结构图如下:,Abstraction:定义抽象类(接口),并维护一个Implementor类型对象。,RefinedAbstraction:抽象类的具体实现。,Implementor:实现层的抽象父类(接口),提供基本操作,以供抽象层次的类调用。,ConcreteImplementor:Implementor的具体实现。,Bridge模式示例,publicabstractclassInforListInforlistFormatFormat;publicvoidsetFormat(InforlistFormatFormat)this.Format=Format;publicInforlistFormatgetFormat()returnthis.Format;publicabstractvoiddistributeInforList();publicabstractclassInforlistFormatpublicabstractvoidformatImpl();publicclassStudentInforListextendsInforListpublicvoiddistributeInforList()System.out.println(这是学生信息单);InforlistFormatformat=this.getFormat();format.formatImpl();publicclassTeacherInforListextendsInforListpublicvoiddistributeInforList()System.out.println(这是老师信息单);InforlistFormatformat=this.getFormat();format.formatImpl();publicclassHtmlFormatextendsInforlistFormatpublicvoidformatImpl()System.out.println(使用HTML格式生成);publicclassPlainTextFormatextendsInforlistFormatpublicvoidformatImpl()System.out.println(使用纯文本格式生成);,Bridge模式优势和不足,不足:Bridge模式的应用一般用于“两个非常强的变化维度”,有时即使有两个变化的维度,但是某个方向的变化维度并不剧烈,换言之两个变化不会导致纵横交错的结果,并没必要使用Bridge模式。,分离抽象部分及其实现部分。,提高可扩充性。可以独立的对抽象部分和实现部分进行扩充。,Bridge模式是比多继承方案更好的一种解决方法。,Bridge模式主要有以下一些优点:,向客户隐藏了实现部分,从而当需要扩展/更改实现部分时,不需要重新编译客户代码。,Composite模式,Composite模式即合成模式,将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将简单元素与复合元素同等看待。如文件夹与文件就是合成模式的典型应用。,模式介绍,主要适用于以下情况:,需要表示对象的部分和整体的层次结构。,希望用户忽略组合对象与单个对象的区别,用户将统一使用组合结构中的所有对象。,Composite模式结构图,合成模式结构图如下:,Component:为组合中的对象声明接口,定义所有类共有接口的缺省行为。,Leaf:表示叶子节点,叶子节点没有子节点。,Composite:所有可以包含子节点的类都扩展这个类。这个类的主要功能是用来存储子部件,实现了接口中的方法。,Client:通过接口操纵组合部件的对象。,Composite模式示例,publicabstractclassComputerprotectedStringname;publicComputer(Stringname)=name;publicabstractvoidgetPart();importjava.util.*;publicclassComputerPartextendsComputerprotectedVectorpart=newVector();publicComputerPart(Stringname)super(name);publicvoidgetPart()System.out.println(name);System.out.println(name+中的部件:);for(inti=0;ipart.size();i+)Computerc=(Computer)part.get(i);c.getPart();publicvoidadd(Computerc)part.add(c);publicvoidremove(Computerc)part.remove(c);publicclassChildPartextendsComputerpublicChildPart(Stringname)super(name);publicvoidgetPart()System.out.println(name);,Composite模式优势和不足,Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,,将“客户代码与复杂的对象容器结构”解耦,解耦之后,客户端代码将与纯粹的抽象接口,而非对象容器的复内部实现结构,发生依赖关系,从而更能“应对变化”。,Composite模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。,Bridge模式优点和不足:,Composite模式在具体实现中,可以让父对象中的子对象反向追溯,Decorator模式,Decorator模式即装饰模式,是指动态的给一个对象添加一些额外的职责,在Java的IO操作中,经常会用到诸如如下的语句:,模式介绍,主要适用于以下情况:,在不影响其他对象的情况下,以动态、透明的方式给单个对象添加方法。或者处理那些可以撤消的方法。,当不能采用生成子类的方式进行扩充时。,BufferedReaderbr=newBufferedReader(newInputStreamReader(newFileInputStream(newFile(D:a.txt);while(br.readLine()!=null)System.out.println(br.readLine();,在该代码中使用多个的Decorator被层叠在一起,最后得到一个功能强大的流。既能够被缓冲,又能够得到行数,,Decorator模式结构图,装饰模式结构图如下:,Component:定义一个对象接口,以规范准备接收附加责任的对象。,ConcreteComponent:定义一个将要接收附加责任的类。,Decorator:持有一个组件对象的实例,并定义一个与抽象组件接口一致的接口。,ConcreteDecorator:负责给组件对象“贴上”附加的责任。,Decorator模式示例,publicinterfacePhonepublicvoiduse();publicclassHomePhoneimplementsPhonepublicvoiduse()System.out.println(打电话、接电话);publicclassDecoratorimplementsPhonePhonephone;publicDecorator(Phonephone)this.phone=phone;publicvoiduse()phone.use();publicclassAutoDecoratorextendsDecoratorpublicAutoDecorator(Phonephone)super(phone);publicvoiduse()phone.use();System.out.println(装配自动回复功能);publicclassWatchDecoratorextendsDecoratorpublicWatchDecorator(Phonephone)super(phone);publicvoiduse()phone.use();System.out.println(装配可视功能);publicclassClientpublicstaticvoidmain(Stringargs)Phonep=newHomePhone();p.use();/添加自动回复功能Phonep1=newDecorator(newAutoDecorator(p);p1.use();/添加自动回复功能和可视功能Phonep2=newDecorator(newWatchDecorator(newAutoDecorator(p);p2.use();,Decorator模式优势和不足,Decorator模式主要有以下几点优势:,比静态继承更灵活。,避免了在层次结构中高层的类有太多的特性。Decorator模式提供了一种“即用即付”的方法来添加职责。,Decorator模式的不足之处主要在于有太多的小对象。采用Decorator模式进行设计往往会产生许多看上去类似的小对象,这些对象仅仅在它们相互连接的方式上有所不同,所以在排错时会很困难。,Decorator模式不足,Facade模式,Facade模式(外观模式)的意图是:为子系统中的一组接口提供一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。,模式介绍,主要适用于以下情况:,当要为一个复杂子系统提供一个简单接口时。,客户程序与抽象类的实现部分之间存在着很大的依赖性。,当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。,Facade模式结构图,外观模式结构图如下:,Facade:知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。,子系统类(Subsystemclasses):实现子系统的功能,处理由Facade对象指派的任务。,Facade模式示例,importjava.sql.*;publicclassClientpublicstaticvoidmain(Stringargs)DBConnectionb=newDBConnection();b.setDriver(com.microsoft.jdbc.sqlserver.SQLServerDriver);b.setServername(lacalhost);b.setDBname(pubs);tryConnectionc=b.connect();ResultSetrs=c.createStatement().executeQuery(select*fromsale);while(rs.next()System.out.println(rs.getString(1);catch(Exceptione)System.out.println(e);classDBConnectionStringdriver,servername,dbname;publicvoidsetDriver(Stringdriver)this.driver=driver;publicvoidsetServername(Stringservername)this.servername=servername;publicvoidsetDBname(Stringdbname)this.dbname=dbname;publicConnectionconnect()tryClass.forName(driver);Connectioncn=DriverManager.getConnection(jdbc:microsoft:sqlserver:/“+servername+:1433;databasename=+dbname,sa,);System.out.println(信息提示:连接+servername+服务器+dbname+数据库已成功!);returncn;catch(Exceptione)System.out.println(信息提示:连接+servername+服务器+dbname+失败!n+e);returnnull;,Facade模式优势和不足,Facade模式主要有以下几点优势:,对客户屏蔽子系统组件,因而减少了客户处理的对象的数目,使得子系统使用起来更加方便。,实现了子系统与客户间的松耦合关系。松耦合关系使得子系统的组件变化不会影响到客户端。,Facade模式不足,Facade模式的缺点主要在于使用Facade模式时,要定义interface是很麻烦的一件事情,特别是在内部类所能提供的方法还没确定或外部所需功能还没确定的时候尤为如此。,Flyweight模式,Flyweight模式即享元模式,该模式的意图是避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内部状态和外部状态。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。应用场合很多,比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中。,模式介绍,当以下情况都成立时使用Flyweight模式:,一个应用程序使用了大量的对象。,由于使用了大量的对象,造成很大的开销。,如果删除对象的外部状态,就可以使用相对较少的共享对象来取代很多组对象。,应用程序不依赖于对象标识。,Flyweight模式结构图,享元模式结构图如下:,Flyweight:描述一个接口,通过这个接口Flyweight示例对象可接受并作用于外部状态。,UnsharedConcreteFlyweight:并非所有的Flyweight子类都需要被共享,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。,FlyweightFactory:创建并管理Flyweight对象,确保合理的共享Flyweight。,ConcreteFlyweight:实现Flyweight接口,并为内部状态添加存储空间。,Flyweight模式示例,publicinterfaceFlyweightpublicabstractvoidoperation();publicclassConcreteFlyweightimplementsFlyweightprivateStringstring;publicConcreteFlyweight(Stringstr)string=str;publicvoidoperation()System.out.println(Concrete-Flyweight:+string);importjava.util.Hashtable;publicclassFlyweightFactoryprivateHashtableflyweights=newHashtable();publicFlyweightgetFlyWeight(Objectobj)Flyweightflyweight=(Flyweight)flyweights.get(obj);if(flyweight=null)/产生新的ConcreteFlyweightflyweight=newConcreteFlyweight(obj.toString();flyweights.put(obj,flyweight);returnflyweight;publicintgetFlyweightSize()returnflyweights.size();,FlyweightFactory对象提供了一个已创建的实例,如果该实例没有,FlyweightFactory对象就创建一个。,Flyweight模式优势和不足,Flyweight模式优势:,Flyweight模式不足:,Flyweight模式主要是对存储的节约,共享的Flyweight越多,存储节约也就越多,节约量随着共享状态的增多而增大。可以使用两种方法来节约存储,即使用共享来减少内部状态的消耗和用计算时间换取对外部状态的存储。,使用该模式时,传输、查找和计算外部状态都会产生运行时的开销,尤其当Flyweight对象原先被存储为内部状态时,开销会更大。,Proxy模式,Proxy模式中要创建“stub”或“surrogate”对象,它们的目的是接受请求并把请求转发到实际执行工作的其他对象。比如远程方法调用(RMI)利用Proxy模式,使得在其他JVM中执行的对象就像本地对象一样;Proxy模式在实际中经常应用,比如Windows系统提供的快捷方法。,模式介绍,该模式主要有以下几种情况:,远程代理(RemoteProxy):在不同的地址空间中提供局部代表。,虚代理(VirtualProxy):根据需要创建开销很大的对象。,智能指引(SmartReference):取代简单指针。,保护代理(ProtectionProxy):控制对原始对象的访问。,Proxy模式结构图,代理模式结构图如下:,Subject:定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。,RealSubject:定义Proxy所代表的实体。,Proxy:保存一个引用使得代理可以访问实体。控制对实体的存取,并可能负责创建和删除它,其他功能依赖于代理的类型。,Proxy模式示例,abstractinterfaceSubjectabstractpublicvoidrequest();classRealSubjectimplementsSubjectpublicvoidrequest()System.out.println(HelloWorld!);classProxySubjectimplementsSubject/以真实角色作为代理角色的属性privateRealSubjectrealSubject;publicvoidrequest()preRequest();if(realSubject=null)realSubject=newRealSubject();realSubject.request();/此处执行真实对象的request()方法postRequest();privatevoidpreRequest()System.out.println(代理角色即将调用真实对象的request()方法);privatevoidpostRequest()System.out.println(调用真实对象的request()方法结束);,客户段可通过如下的代码访问真实对象的方法:Subjectsub=newProxySubject();sub.request();,java动态代理类,StaticClassgetProxyClass(ClassLoaderloader,Classinterfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。,java.lang.reflect类库中提供三个类直接支持代理模式:Proxy,InvocationHandler和Method。,Proxy类:该类即为动态代理类。主要有如下主要方法:,ProtectedProxy(InvocationHandlerh):构造函数,用于给内部的h赋值。,StaticObjectnewProxyInstance(ClassLoaderloader,Classinterfaces,InvocationHandlerh):返回代理类的一个实例。,InvocationHandler接口:该接口中仅定义了一个方法Objecti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自考计算机基础历年真题解析
- 制造业绩效工资方案设计与应用
- 办公室文件管理及归档规范
- 中考化学历年真题与详细解析
- 文学概论重点考点解析与练习
- 安全技术交底记录标准范本
- 小学科学探究实验设计思路
- 企业知识管理体系搭建思路
- 化工原料安全数据表MSDS应用指南
- 企业人才培养与梯队建设方法
- DZ∕T 0270-2014 地下水监测井建设规范
- 增强型水泥基泡沫保温隔声板建筑地面工程应用技术标准
- 虚拟现实技术在物流管理中的应用
- 志愿者安全培训课件
- 私募基金管理人尽职调查清单
- 居民自建桩安装告知书回执
- 科普:农药毒性分类
- 陈阅增普通生物学第1篇3细胞结构与细胞通讯教学课件
- 【执业药师考试】执业药师历年真题
- FZ/T 81004-2022连衣裙、裙套
- GB/T 34875-2017离心泵和转子泵用轴封系统
评论
0/150
提交评论