《结构型模式精选PPT.ppt》由会员分享,可在线阅读,更多相关《结构型模式精选PPT.ppt(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、结构型模式结构型模式第1页,此课件共37页哦课程目标课程目标q 结构型模式概述结构型模式概述q Adapter模式模式q Bridge模式模式q Composite模式模式q Decorator模式模式q Faade模式模式q Flyweight模式模式q Proxy模式模式 第2页,此课件共37页哦体验项目体验项目 使用使用Composite模式来编写如图模式来编写如图3-1所示的二叉树,然后使用深度优先搜索法遍所示的二叉树,然后使用深度优先搜索法遍历该二叉树,并打印出根节点的高度,运行效果如图历该二叉树,并打印出根节点的高度,运行效果如图3-2所示。所示。图3-1二叉树图 图3-2 二叉树
2、遍历结果图第3页,此课件共37页哦结构型模式概述结构型模式概述 结构型模式是为解决怎样组装现有的类,设计他们的交互方式,从而达到实结构型模式是为解决怎样组装现有的类,设计他们的交互方式,从而达到实现一定的功能的目的。同时,结构型模式包容了对很多问题的解决,例如扩现一定的功能的目的。同时,结构型模式包容了对很多问题的解决,例如扩展性展性(外观模式,组成模式,代理模式,装饰模式),封装性(适配器模式,外观模式,组成模式,代理模式,装饰模式),封装性(适配器模式,桥接模式)。桥接模式)。结构型模式中解决了以下几个问题:结构型模式中解决了以下几个问题:在不破坏类封装性的基础上,实现新的功能。这一点包括
3、装饰模式,代理在不破坏类封装性的基础上,实现新的功能。这一点包括装饰模式,代理模式。模式。在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行交互。在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行交互。这一点包括桥接和适配器模式。这一点包括桥接和适配器模式。创建一组类的统一访问接口,这是组成模式。创建一组类的统一访问接口,这是组成模式。对同一类创建不同的访问界面,提供给不同需要的访问者,这是外观模式。对同一类创建不同的访问界面,提供给不同需要的访问者,这是外观模式。第4页,此课件共37页哦Adapter模式模式 适配器模式有类适配器和对象匹配器两种形式。其中类适配器使用多继承(
4、由于适配器模式有类适配器和对象匹配器两种形式。其中类适配器使用多继承(由于java不支持多继承,所以可以引入接口的概念)来实现一个接口对另一个接口的匹配,不支持多继承,所以可以引入接口的概念)来实现一个接口对另一个接口的匹配,对象适配器主要依赖于对象组合来实现接口的匹配。比如对象适配器主要依赖于对象组合来实现接口的匹配。比如java窗体事件处理的事窗体事件处理的事件适配器就是一个很好的例子。件适配器就是一个很好的例子。模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况:使用一个已经存在的类,而它的接口不符合你的需求。使用一个已经存在的类,而它的接口不符合你的需求。创建一个可以复用的类,该
5、类可以与其他不相关的类或不可预见的类创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。(即那些接口可能不一定兼容的类)协同工作。使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口,仅适用于对象适配器。对象适配器可以适配它的父类接口,仅适用于对象适配器。第5页,此课件共37页哦Adapter模式结构图模式结构图适配器模式结构图如下:适配器模式结构图如下:类适配器结构图 对象适配器结构图 Target:定义:定义Client
6、使用的与特定应用或领域相关的接口。使用的与特定应用或领域相关的接口。Adaptee:定义一个已经存在的类,该类需要适配。:定义一个已经存在的类,该类需要适配。Adapter:对:对Adaptee类和类和Target接口进行适配。接口进行适配。Client通过通过Adapter实例对象来实例对象来调用某些方法,然后适配器调用调用某些方法,然后适配器调用Adaptee的方法来实现请求的方法来实现请求第6页,此课件共37页哦适配器模式示例适配器模式示例比如我们编写过两个类,分别用于画圆形桩和方形桩,假设现在有一个应用,需比如我们编写过两个类,分别用于画圆形桩和方形桩,假设现在有一个应用,需要既画方形
7、桩,又要画圆形桩,就可以使用该模式实现。要既画方形桩,又要画圆形桩,就可以使用该模式实现。使用对象适配器使用对象适配器 模式实现如下:模式实现如下:public class DrawRoundpublic void displayRound(String msg)System.out.println(DrawRound displayRound():+msg);public class DrawSquarepublic void displaySquare(String str)System.out.println(DrawSquare displaySquare():+str);public
8、 class ShapeAdapter extends DrawSquareprivate DrawRound round;public ShapeAdapter(DrawRound r)this.round=r;public void insertRound(String str)round.displayRound(str);第7页,此课件共37页哦使用类适配器使用类适配器 模式实现如下:模式实现如下:public interface DrawRoundInterfacepublic void displayRound(String msg);public class DrawRound
9、implements DrawRoundInterface public void displayRound(String msg)System.out.println(DrawRound displayRound():+msg);public class ShapeAdapter extends DrawSquare implements DrawRoundInterfaceprivate DrawRound round;public ShapeAdapter(DrawRound r)this.round=r;public void displayRound(String msg)round
10、.displayRound(msg);/doSomethingpublic class Client public static void main(String args)ShapeAdapter d=new ShapeAdapter(new DrawRound();d.insertRound(圆形圆形);d.displaySquare(方形方形);第8页,此课件共37页哦Adapter模式模式优势和不足优势和不足 类适配器的优缺点如下类适配器的优缺点如下:用一个具体的用一个具体的Adapter类对类对Adaptee和和Target进行匹配。结果是当我们想要匹配一个进行匹配。结果是当我们想要
11、匹配一个类以及所有它的子类时,类类以及所有它的子类时,类Adapter将不能胜任工作。将不能胜任工作。使得使得Adapter可以重定义可以重定义Adaptee的部分行为。的部分行为。对象适配器的优缺点如下:对象适配器的优缺点如下:允许一个允许一个Adapter与多个与多个Adaptee,即,即Adaptee本身以及它的所有子类(如果有子本身以及它的所有子类(如果有子类的话)同时工作。类的话)同时工作。使得重定义使得重定义Adaptee的行为比较困难。的行为比较困难。仅仅引入了一个对象,并不需要额外的引用(指针)以间接得到仅仅引入了一个对象,并不需要额外的引用(指针)以间接得到Adaptee。第
12、9页,此课件共37页哦Bridge模式模式在面向对象设计的基本概念中,对象这个概念实际上是由属性和行为两个部分组成的,在面向对象设计的基本概念中,对象这个概念实际上是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,一种抽象的。一般情况下,行为是包含在一个对象属性我们可以认为是一种静止的,一种抽象的。一般情况下,行为是包含在一个对象中,但是在有些情况下,我们需要将这些行为也进行归类,形成一个总的行为接口,中,但是在有些情况下,我们需要将这些行为也进行归类,形成一个总的行为接口,这就是桥接模式的用处。这就是桥接模式的用处。模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况:不希望在
13、抽象和它的实现部分之间有一个固定的绑定关系。不希望在抽象和它的实现部分之间有一个固定的绑定关系。类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。在多个对象间共享实现(可能使用引用计数),但同时要求客户并在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。不知道这一点。第10页,此课件共37页哦Bridge模式结构图模式结构图桥接模式结构图如下:桥接模式结构图如下:Abstraction:定义抽象类(接口),并维护一个:定义抽象类(接口),并维护一个Implementor类型对象。类型对象。RefinedAb
14、straction:抽象类的具体实现。:抽象类的具体实现。Implementor:实现层的抽象父类(接口),提供基本操作,以供抽象层次的:实现层的抽象父类(接口),提供基本操作,以供抽象层次的类调用。类调用。ConcreteImplementor:Implementor的具体实现。的具体实现。第11页,此课件共37页哦Bridge模式示例模式示例public abstract class InforListInforlistFormat Format;public void setFormat(InforlistFormat Format)this.Format=Format;public I
15、nforlistFormat getFormat()return this.Format;public abstract void distributeInforList();public abstract class InforlistFormatpublic abstract void formatImpl();public class StudentInforList extends InforListpublic void distributeInforList()System.out.println(这是学生信息单这是学生信息单);InforlistFormat format=thi
16、s.getFormat();format.formatImpl();public class TeacherInforList extends InforListpublic void distributeInforList()System.out.println(这是老师信息单这是老师信息单);InforlistFormat format=this.getFormat();format.formatImpl();public class HtmlFormat extends InforlistFormatpublic void formatImpl()System.out.println(使
17、用使用HTML格式生成格式生成);public class PlainTextFormat extends InforlistFormatpublic void formatImpl()System.out.println(使用纯文本格式生成使用纯文本格式生成);第12页,此课件共37页哦Bridge模式优势和不足模式优势和不足 不足:不足:Bridge模式的应用一般用于模式的应用一般用于“两个非常强的变化维度两个非常强的变化维度”,有时即使有两个变化的维,有时即使有两个变化的维度,但是某个方向的变化维度并不剧烈,换言之两个变化不会导致纵横交错的结果,度,但是某个方向的变化维度并不剧烈,换言之
18、两个变化不会导致纵横交错的结果,并没必要使用并没必要使用Bridge模式。模式。分离抽象部分及其实现部分。分离抽象部分及其实现部分。提高可扩充性。可以独立的对抽象部分和实现部分进行扩充。提高可扩充性。可以独立的对抽象部分和实现部分进行扩充。Bridge模式是比多继承方案更好的一种解决方法。模式是比多继承方案更好的一种解决方法。Bridge模式主要有以下一些优点:模式主要有以下一些优点:向客户隐藏了实现部分,从而当需要扩展向客户隐藏了实现部分,从而当需要扩展/更改实现部分时,不需要重新编更改实现部分时,不需要重新编译客户代码。译客户代码。第13页,此课件共37页哦 Composite模式模式 C
19、omposite模式即合成模式,将对象组织到树结构中,可以用来描述整体与部分模式即合成模式,将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将简单元素与复合元素同等看待。如文件夹与文的关系。合成模式可以使客户端将简单元素与复合元素同等看待。如文件夹与文件就是合成模式的典型应用。件就是合成模式的典型应用。模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况:需要表示对象的部分和整体的层次结构。需要表示对象的部分和整体的层次结构。希望用户忽略组合对象与单个对象的区别,用户将统一使用组合结构中的希望用户忽略组合对象与单个对象的区别,用户将统一使用组合结构中的所有对象。所有
20、对象。第14页,此课件共37页哦 Composite模式结构图模式结构图合成模式结构图如下:合成模式结构图如下:Component:为组合中的对象声明接口,定义所有类共有接口的缺省行为。:为组合中的对象声明接口,定义所有类共有接口的缺省行为。Leaf:表示叶子节点,叶子节点没有子节点。:表示叶子节点,叶子节点没有子节点。Composite:所有可以包含子节点的类都扩展这个类。这个类的主要功:所有可以包含子节点的类都扩展这个类。这个类的主要功能是用来存储子部件,实现了接口中的方法。能是用来存储子部件,实现了接口中的方法。Client:通过接口操纵组合部件的对象。:通过接口操纵组合部件的对象。第1
21、5页,此课件共37页哦Composite模式示例模式示例public abstract class Computer protected String name;public Computer(String name)this.name=name;public abstract void getPart();import java.util.*;public class ComputerPart extends Computerprotected Vector part=new Vector();public ComputerPart(String name)super(name);publi
22、c void getPart()System.out.println(name);System.out.println(name+中的部件:中的部件:);for(int i=0;ipart.size();i+)Computer c=(Computer)part.get(i);c.getPart();public void add(Computer c)part.add(c);public void remove(Computer c)part.remove(c);public class ChildPart extends Computer public ChildPart(String na
23、me)super(name);public void getPart()System.out.println(name);第16页,此课件共37页哦Composite模式优势和不足模式优势和不足 Composite模式采用树形结构来实现普遍存在的对象容器,从而将模式采用树形结构来实现普遍存在的对象容器,从而将“一对多一对多”的关系的关系转化为转化为“一对一一对一”的关系,的关系,将将“客户代码与复杂的对象容器结构客户代码与复杂的对象容器结构”解耦解耦,解耦之后,客户端代码将与纯粹的,解耦之后,客户端代码将与纯粹的抽象接口,而非对象容器的复内部实现结构,发生依赖关系,从而更能抽象接口,而非对象容
24、器的复内部实现结构,发生依赖关系,从而更能“应对变化应对变化”。Composite模式中,是将模式中,是将“Add和和Remove等和对象容器相关的方法等和对象容器相关的方法”定义定义在在“表示抽象对象的表示抽象对象的Component类类”中,还是将其定义在中,还是将其定义在“表示对象容器的表示对象容器的Composite类类”中,是一个关乎中,是一个关乎“透明性透明性”和和“安全性安全性”的两难问题,需要仔细的两难问题,需要仔细权衡。这里有可能违背面向对象的权衡。这里有可能违背面向对象的“单一职责原则单一职责原则”,但是对于这种特殊结构,这,但是对于这种特殊结构,这又是必须付出的代价。又是
25、必须付出的代价。Bridge模式优点和不足:模式优点和不足:Composite模式在具体实现中,可以让父对象中的子对象反向追溯模式在具体实现中,可以让父对象中的子对象反向追溯 第17页,此课件共37页哦Decorator模式模式 Decorator模式即装饰模式,是指动态的给一个对象添加一些额外的职责,在模式即装饰模式,是指动态的给一个对象添加一些额外的职责,在Java 的的IO操作中,经常会用到诸如如下的语句:操作中,经常会用到诸如如下的语句:模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加方在不影响其他对象的情况下,以动态
26、、透明的方式给单个对象添加方法。或者处理那些可以撤消的方法。法。或者处理那些可以撤消的方法。当不能采用生成子类的方式进行扩充时。当不能采用生成子类的方式进行扩充时。BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File(D:a.txt);while(br.readLine()!=null)System.out.println(br.readLine();在该代码中使用多个的在该代码中使用多个的Decorator被层叠在一起,最后得到一个功能强大的流。既能够被层叠在一起,最后得
27、到一个功能强大的流。既能够被缓冲,又能够得到行数,被缓冲,又能够得到行数,第18页,此课件共37页哦Decorator模式结构图模式结构图装饰模式结构图如下:装饰模式结构图如下:Component:定义一个对象接口,以规范准备接收附加责任的对象。:定义一个对象接口,以规范准备接收附加责任的对象。ConcreteComponent:定义一个将要接收附加责任的类。:定义一个将要接收附加责任的类。Decorator:持有一个组件对象的实例,并定义一个与抽象组件接口一致的接口。:持有一个组件对象的实例,并定义一个与抽象组件接口一致的接口。ConcreteDecorator:负责给组件对象:负责给组件对
28、象“贴上贴上”附加的责任。附加的责任。第19页,此课件共37页哦Decorator模式示例模式示例public interface Phone public void use();public class HomePhone implements Phonepublic void use()System.out.println(打电话、接电话打电话、接电话);public class Decorator implements PhonePhone phone;public Decorator(Phone phone)this.phone=phone;public void use()phone
29、.use();public class AutoDecorator extends Decorator public AutoDecorator(Phone phone)super(phone);public void use()phone.use();System.out.println(装配自动回复功能装配自动回复功能);public class WatchDecorator extends Decorator public WatchDecorator(Phone phone)super(phone);public void use()phone.use();System.out.pri
30、ntln(装配可视功能装配可视功能);public class Client public static void main(String args)Phone p=new HomePhone();p.use();/添加自动回复功能添加自动回复功能Phone p1=new Decorator(new AutoDecorator(p);p1.use();/添加自动回复功能和可视功能添加自动回复功能和可视功能Phone p2=new Decorator(new WatchDecorator(new AutoDecorator(p);p2.use();第20页,此课件共37页哦Decorator模式
31、优势和不足模式优势和不足 Decorator模式主要有以下几点优势:模式主要有以下几点优势:比静态继承更灵活。比静态继承更灵活。避免了在层次结构中高层的类有太多的特性。避免了在层次结构中高层的类有太多的特性。Decorator模式提供了一种模式提供了一种“即用即即用即付付”的方法来添加职责。的方法来添加职责。Decorator模式的不足之处主要在于有太多的小对象。采用模式的不足之处主要在于有太多的小对象。采用Decorator模式进行设模式进行设计往往会产生许多看上去类似的小对象,这些对象仅仅在它们相互连接的方式上有所不同,计往往会产生许多看上去类似的小对象,这些对象仅仅在它们相互连接的方式上
32、有所不同,所以在排错时会很困难。所以在排错时会很困难。Decorator模式不足模式不足第21页,此课件共37页哦Facade模式模式 Facade模式(外观模式)的意图是:为子系统中的一组接口提供一致的界面,模式(外观模式)的意图是:为子系统中的一组接口提供一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况:当要为一个复杂子系统提供一个简单接口时。当要为一个复杂子系统提供一个简单接口时。客户程序与抽象类的实现部分之间存在着很大的依赖性。客户程序
33、与抽象类的实现部分之间存在着很大的依赖性。当需要构建一个层次结构的子系统时,使用当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的模式定义子系统中每层的入口点。入口点。第22页,此课件共37页哦Facade模式结构图模式结构图外观模式结构图如下:外观模式结构图如下:Facade:知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统:知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。对象。子系统类(子系统类(Subsystem classes):实现子系统的功能,处理由):实现子系统的功能,处理由Facade对象指对象指派的任务。派的任务。第23页,
34、此课件共37页哦Facade模式示例模式示例import java.sql.*;public class Client public static void main(String args)DBConnection b=new DBConnection();b.setDriver(com.microsoft.jdbc.sqlserver.SQLServerDriver);b.setServername(lacalhost);b.setDBname(pubs);tryConnection c=b.connect();ResultSet rs=c.createStatement().execut
35、eQuery(select*from sale);while(rs.next()System.out.println(rs.getString(1);catch(Exception e)System.out.println(e);class DBConnection String driver,servername,dbname;public void setDriver(String driver)this.driver=driver;public void setServername(String servername)this.servername=servername;public v
36、oid setDBname(String dbname)this.dbname=dbname;public Connection connect()try Class.forName(driver);Connection cn=DriverManager.getConnection(jdbc:microsoft:sqlserver:/“+servername+:1433;databasename=+dbname,sa,);System.out.println(信息提示:连接信息提示:连接+servername+服务器服务器+dbname+数据库已成功!数据库已成功!);return cn;ca
37、tch(Exception e)System.out.println(信息提示:连接信息提示:连接+servername+服务器服务器+dbname+失败!失败!n+e);return null;第24页,此课件共37页哦Facade模式优势和不足模式优势和不足 Facade模式主要有以下几点优势:模式主要有以下几点优势:对客户屏蔽子系统组件,因而减少了客户处理的对象的数目,使得子系统使用起对客户屏蔽子系统组件,因而减少了客户处理的对象的数目,使得子系统使用起来更加方便。来更加方便。实现了子系统与客户间的松耦合关系。松耦合关系使得子系统的组件变化实现了子系统与客户间的松耦合关系。松耦合关系使得
38、子系统的组件变化不会影响到客户端。不会影响到客户端。Facade模式不足模式不足Facade模式的缺点主要在于使用模式的缺点主要在于使用Facade模式时,要定义模式时,要定义interface是很麻烦的一件是很麻烦的一件事情,特别是在内部类所能提供的方法还没确定或外部所需功能还没确定的事情,特别是在内部类所能提供的方法还没确定或外部所需功能还没确定的时候尤为如此。时候尤为如此。第25页,此课件共37页哦 Flyweight模式模式 Flyweight模式即享元模式,该模式的意图是避免大量拥有相同内容的小类的模式即享元模式,该模式的意图是避免大量拥有相同内容的小类的开销(如耗费内存),使大家共
39、享一个类(元类)。开销(如耗费内存),使大家共享一个类(元类)。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内部状态和外部状态。区分内部状态和外部状态。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。应用模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。应用场合很多,比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复场合很多,比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在的,那么
40、我们可以将这些字符串储存在Flyweight池池(pool)中。中。模式介绍模式介绍 当以下情况都成立时使用当以下情况都成立时使用Flyweight模式:模式:一个应用程序使用了大量的对象。一个应用程序使用了大量的对象。由于使用了大量的对象,造成很大的开销。由于使用了大量的对象,造成很大的开销。如果删除对象的外部状态,就可以使用相对较少的共享对象来取代很多组如果删除对象的外部状态,就可以使用相对较少的共享对象来取代很多组对象。对象。应用程序不依赖于对象标识。应用程序不依赖于对象标识。第26页,此课件共37页哦Flyweight模式结构图模式结构图享元模式结构图如下:享元模式结构图如下:Flyw
41、eight:描述一个接口,通过这个接口:描述一个接口,通过这个接口Flyweight示例对象可接受并作用示例对象可接受并作用于外部状态。于外部状态。UnsharedConcreteFlyweight:并非所有的:并非所有的Flyweight子类都需要被共享,子类都需要被共享,UnsharedConcreteFlyweight对象通常将对象通常将ConcreteFlyweight对象作为子节点。对象作为子节点。FlyweightFactory:创建并管理:创建并管理Flyweight对象,确保合理的共享对象,确保合理的共享Flyweight。ConcreteFlyweight:实现:实现Flyw
42、eight接口,并为内部状态添加存储空间。接口,并为内部状态添加存储空间。第27页,此课件共37页哦Flyweight模式示例模式示例public interface Flyweightpublic abstract void operation();public class ConcreteFlyweight implements Flyweightprivate String string;public ConcreteFlyweight(String str)string=str;public void operation()System.out.println(Concrete-Fly
43、weight:+string);import java.util.Hashtable;public class FlyweightFactoryprivate Hashtable flyweights=new Hashtable();public Flyweight getFlyWeight(Object obj)Flyweight flyweight=(Flyweight)flyweights.get(obj);if(flyweight=null)/产生新的产生新的ConcreteFlyweightflyweight=new ConcreteFlyweight(obj.toString();
44、flyweights.put(obj,flyweight);return flyweight;public int getFlyweightSize()return flyweights.size();FlyweightFactory对象提供了一个已创建的实例,如果该实例没有,FlyweightFactory对象就创建一个。第28页,此课件共37页哦Flyweight模式优势和不足模式优势和不足 Flyweight模式优势:模式优势:Flyweight模式不足:模式不足:Flyweight模式主要是对存储的节约,共享的模式主要是对存储的节约,共享的Flyweight越多,存储节约也就越多,节约
45、越多,存储节约也就越多,节约量随着共享状态的增多而增大。可以使用两种方法来节约存储,即使用共享来减少量随着共享状态的增多而增大。可以使用两种方法来节约存储,即使用共享来减少内部状态的消耗和用计算时间换取对外部状态的存储。内部状态的消耗和用计算时间换取对外部状态的存储。使用该模式时,传输、查找和计算外部状态都会产生运行时的开销,尤其当使用该模式时,传输、查找和计算外部状态都会产生运行时的开销,尤其当Flyweight对象原先被存储为内部状态时,开销会更大。对象原先被存储为内部状态时,开销会更大。第29页,此课件共37页哦Proxy模式模式Proxy 模模式式中中要要创创建建“stub”或或“su
46、rrogate”对对象象,它它们们的的目目的的是是接接受受请请求求并并把把请请求求转转发发到实际执行工作的其他对象。到实际执行工作的其他对象。比比如如远远程程方方法法调调用用(RMI)利利用用Proxy模模式式,使使得得在在其其他他JVM中中执执行行的的对对象象就就像像本本地地对对象一样;象一样;Proxy模式在实际中经常应用,比如模式在实际中经常应用,比如Windows系统提供的快捷方法。系统提供的快捷方法。模式介绍模式介绍 该模式主要有以下几种情况:该模式主要有以下几种情况:远程代理(远程代理(Remote Proxy):在不同的地址空间中提供局部代表。):在不同的地址空间中提供局部代表。
47、虚代理(虚代理(Virtual Proxy):根据需要创建开销很大的对象。):根据需要创建开销很大的对象。智能指引(智能指引(Smart Reference):取代简单指针。):取代简单指针。保护代理(保护代理(Protection Proxy):控制对原始对象的访问。):控制对原始对象的访问。第30页,此课件共37页哦Proxy模式结构图模式结构图代理模式结构图如下:代理模式结构图如下:Subject:定义:定义RealSubject和和Proxy的共用接口,这样就在任何使用的共用接口,这样就在任何使用RealSubject的地方都可以使用的地方都可以使用Proxy。RealSubject:
48、定义:定义Proxy所代表的实体。所代表的实体。Proxy:保存一个引用使得代理可以访问实体。控制对实体的存取,并可能负责创建:保存一个引用使得代理可以访问实体。控制对实体的存取,并可能负责创建和删除它,其他功能依赖于代理的类型。和删除它,其他功能依赖于代理的类型。第31页,此课件共37页哦Proxy模式示例模式示例abstract interface Subjectabstract public void request();class RealSubject implements Subjectpublic void request()System.out.println(Hello Wo
49、rld!);class ProxySubject implements Subject/以真实角色作为代理角色的属性以真实角色作为代理角色的属性private RealSubject realSubject;public void request()preRequest();if(realSubject=null)realSubject=new RealSubject();realSubject.request();/此处执行真实对象的此处执行真实对象的request()方法方法postRequest();private void preRequest()System.out.println(
50、代理角色即将调用真实对象的代理角色即将调用真实对象的request()方法方法);private void postRequest()System.out.println(调用真实对象的调用真实对象的request()方法结束方法结束);客户段可通过如下的代码访问真实对象的方法:Subject sub=new ProxySubject();sub.request();第32页,此课件共37页哦java动态代理类动态代理类 Static Class getProxyClass(ClassLoader loader,Class interfaces):获得一个代理类,:获得一个代理类,其中其中lo