软件设计模式之结构模式_第1页
软件设计模式之结构模式_第2页
软件设计模式之结构模式_第3页
软件设计模式之结构模式_第4页
软件设计模式之结构模式_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章第三章结构型模式结构型模式 结构型模式概述 adapter模式 bridge模式 composite模式 decorator模式 faade模式 flyweight模式 proxy模式 体验项目体验项目 使用composite模式来编写如图3-1所示的二叉树,然后使用深度优先搜索法遍历该二叉树,并打印出根节点的高度,运行效果如图3-2所示。 图图3-1二叉树图二叉树图 图图3-2 二叉树遍历结果图二叉树遍历结果图结构型模式概述结构型模式概述 结构型模式是为解决怎样组装现有的类,设计他们的交互方式,从而达结构型模式是为解决怎样组装现有的类,设计他们的交互方式,从而达到实现一定的功能的目的。

2、同时,结构型模式包容了对很多问题的解决,到实现一定的功能的目的。同时,结构型模式包容了对很多问题的解决,例如扩展性例如扩展性(外观模式,组成模式,代理模式,装饰模式),封装性(适外观模式,组成模式,代理模式,装饰模式),封装性(适配器模式,桥接模式)。配器模式,桥接模式)。 结构型模式中解决了以下几个问题:结构型模式中解决了以下几个问题:在不破坏类封装性的基础上,实现新的功能。这一点包括装饰模式,在不破坏类封装性的基础上,实现新的功能。这一点包括装饰模式,代理模式。代理模式。 在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行在不破坏类封装性的基础上,使得类可以同不曾估计到的系统进行交

3、互。这一点包括桥接和适配器模式。交互。这一点包括桥接和适配器模式。 创建一组类的统一访问接口,这是组成模式。创建一组类的统一访问接口,这是组成模式。 对同一类创建不同的访问界面,提供给不同需要的访问者,这是外观对同一类创建不同的访问界面,提供给不同需要的访问者,这是外观模式。模式。 adapter模式模式 适配器模式有类适配器和对象匹配器两种形式。其中类适配器使用多继承适配器模式有类适配器和对象匹配器两种形式。其中类适配器使用多继承(由于(由于java不支持多继承,所以可以引入接口的概念)来实现一个接口对不支持多继承,所以可以引入接口的概念)来实现一个接口对另一个接口的匹配,对象适配器主要依赖

4、于对象组合来实现接口的匹配。另一个接口的匹配,对象适配器主要依赖于对象组合来实现接口的匹配。比如比如java窗体事件处理的事件适配器就是一个很好的例子。窗体事件处理的事件适配器就是一个很好的例子。 模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况: 使用一个已经存在的类,而它的接口不符合你的需求。使用一个已经存在的类,而它的接口不符合你的需求。 创建一个可以复用的类,该类可以与其他不相关的类或不可预见创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。的类(即那些接口可能不一定兼容的类)协同工作。 使用一些已经存在的子类,但是不可能对每

5、一个都进行子类化以匹配使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口,仅适用于对象适配它们的接口。对象适配器可以适配它的父类接口,仅适用于对象适配器。器。 adapter模式结构图模式结构图适配器模式结构图如下: 类适配器结构图类适配器结构图 对象适配器结构图对象适配器结构图 target:定义:定义client使用的与特定应用或领域相关的接口。使用的与特定应用或领域相关的接口。 adaptee:定义一个已经存在的类,该类需要适配。:定义一个已经存在的类,该类需要适配。 adapter:对:对adaptee类和类和target接口进行适配

6、。接口进行适配。client通过通过adapter实实例对象来调用某些方法,然后适配器调用例对象来调用某些方法,然后适配器调用adaptee的方法来实现请求的方法来实现请求适配器模式示例适配器模式示例比如我们编写过两个类,分别用于画圆形桩和方形桩,假设现在有一个比如我们编写过两个类,分别用于画圆形桩和方形桩,假设现在有一个应用,需要既画方形桩,又要画圆形桩,就可以使用该模式实现。应用,需要既画方形桩,又要画圆形桩,就可以使用该模式实现。 使用对象适配器使用对象适配器 模式实现如下:模式实现如下:public class drawroundpublic void displayround(str

7、ing msg)system.out.println(drawround displayround():+msg);public class drawsquarepublic void displaysquare(string str)system.out.println(drawsquare displaysquare():+str); public class shapeadapter extends drawsquareprivate drawround round;public shapeadapter(drawround r)this.round=r;public void inse

8、rtround(string str)round.displayround(str);使用类适配器使用类适配器 模式实现如下:模式实现如下:public interface drawroundinterfacepublic void displayround(string msg);public class drawround implements drawroundinterface public void displayround(string msg)system.out.println(drawround displayround():+msg);public class shapea

9、dapter extends drawsquare implements drawroundinterfaceprivate drawround round;public shapeadapter(drawround r)this.round=r;public void displayround(string msg)round.displayround(msg);/dosomethingpublic class client public static void main(string args) shapeadapter d=new shapeadapter(new drawround()

10、;d.insertround(圆形圆形);d.displaysquare(方形方形);adapter模式模式优势和不足优势和不足 类适配器的优缺点如下类适配器的优缺点如下 :用一个具体的用一个具体的adapter类对类对adaptee和和target进行匹配。结果是当我们进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类想要匹配一个类以及所有它的子类时,类adapter将不能胜任工作。将不能胜任工作。 使得使得adapter可以重定义可以重定义adaptee的部分行为。的部分行为。对象适配器的优缺点如下:对象适配器的优缺点如下:允许一个允许一个adapter与多个与多个adaptee,

11、即,即adaptee本身以及它的所有子类本身以及它的所有子类(如果有子类的话)同时工作。(如果有子类的话)同时工作。 使得重定义使得重定义adaptee的行为比较困难。的行为比较困难。 仅仅引入了一个对象,并不需要额外的引用(指针)以间接得到仅仅引入了一个对象,并不需要额外的引用(指针)以间接得到adaptee。 bridge模式模式在面向对象设计的基本概念中,对象这个概念实际上是由属性和行为两个在面向对象设计的基本概念中,对象这个概念实际上是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,一种抽象的。一般情况下,部分组成的,属性我们可以认为是一种静止的,一种抽象的。一般情况下,行为

12、是包含在一个对象中,但是在有些情况下,我们需要将这些行为也进行为是包含在一个对象中,但是在有些情况下,我们需要将这些行为也进行归类,形成一个总的行为接口,这就是桥接模式的用处。行归类,形成一个总的行为接口,这就是桥接模式的用处。模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况: 不希望在抽象和它的实现部分之间有一个固定的绑定关系。不希望在抽象和它的实现部分之间有一个固定的绑定关系。类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。 在多个对象间共享实现(可能使用引用计数),但同时要求客户在多个对象间共享实现(可能使用引用

13、计数),但同时要求客户并不知道这一点。并不知道这一点。 bridge模式结构图模式结构图桥接模式结构图如下: abstraction:定义抽象类(接口),并维护一个:定义抽象类(接口),并维护一个implementor类型对类型对象。象。 refinedabstraction:抽象类的具体实现。:抽象类的具体实现。 implementor:实现层的抽象父类(接口),提供基本操作,以供:实现层的抽象父类(接口),提供基本操作,以供抽象层次的类调用。抽象层次的类调用。concreteimplementor:implementor的具体实现。的具体实现。 bridge模式示例模式示例public a

14、bstract class inforlistinforlistformat format;public void setformat(inforlistformat format) this.format = format;public inforlistformat getformat() return this.format;public abstract void distributeinforlist();public abstract class inforlistformatpublic abstract void formatimpl();public class studen

15、tinforlist extends inforlistpublic void distributeinforlist( )system.out.println(这是学生信息单这是学生信息单);inforlistformat format=this.getformat();format.formatimpl();public class teacherinforlist extends inforlistpublic void distributeinforlist()system.out.println(这是老师信息单这是老师信息单);inforlistformat format=this.

16、getformat();format.formatimpl();public class htmlformat extends inforlistformatpublic void formatimpl()system.out.println(使用使用html格式生成格式生成);public class plaintextformat extends inforlistformatpublic void formatimpl()system.out.println(使用纯文本格式生成使用纯文本格式生成);bridge模式优势和不足模式优势和不足 不足:不足:bridge模式的应用一般用于模式的

17、应用一般用于“两个非常强的变化维度两个非常强的变化维度”,有时即使有两,有时即使有两个变化的维度,但是某个方向的变化维度并不剧烈,换言之两个变化不个变化的维度,但是某个方向的变化维度并不剧烈,换言之两个变化不会导致纵横交错的结果,并没必要使用会导致纵横交错的结果,并没必要使用bridge模式。模式。 分离抽象部分及其实现部分。分离抽象部分及其实现部分。 提高可扩充性。可以独立的对抽象部分和实现部分进行扩充。提高可扩充性。可以独立的对抽象部分和实现部分进行扩充。 bridge模式是比多继承方案更好的一种解决方法。模式是比多继承方案更好的一种解决方法。 bridge模式主要有以下一些优点:模式主要

18、有以下一些优点: 向客户隐藏了实现部分,从而当需要扩展向客户隐藏了实现部分,从而当需要扩展/更改实现部分时,不需更改实现部分时,不需要重新编译客户代码。要重新编译客户代码。 composite模式模式 composite模式即合成模式,将对象组织到树结构中,可以用来描述整体模式即合成模式,将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将简单元素与复合元素同等看待。与部分的关系。合成模式可以使客户端将简单元素与复合元素同等看待。如文件夹与文件就是合成模式的典型应用。如文件夹与文件就是合成模式的典型应用。 模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况: 需要表

19、示对象的部分和整体的层次结构。需要表示对象的部分和整体的层次结构。 希望用户忽略组合对象与单个对象的区别,用户将统一使用组合希望用户忽略组合对象与单个对象的区别,用户将统一使用组合结构中的所有对象。结构中的所有对象。 composite模式结构图模式结构图合成模式结构图如下: component:为组合中的对象声明接口,定义所有类共有接口的缺:为组合中的对象声明接口,定义所有类共有接口的缺省行为。省行为。 leaf:表示叶子节点,叶子节点没有子节点。:表示叶子节点,叶子节点没有子节点。 composite:所有可以包含子节点的类都扩展这个类。这个类的主:所有可以包含子节点的类都扩展这个类。这个

20、类的主要功能是用来存储子部件,实现了接口中的方法。要功能是用来存储子部件,实现了接口中的方法。client:通过接口操纵组合部件的对象。:通过接口操纵组合部件的对象。 composite模式示例模式示例public abstract class computer protected string name;public computer(string name) = name;public abstract void getpart();import java.util.*;public class computerpart extends computerprotecte

21、d vector part = new vector();public computerpart(string name)super(name);public 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) p

22、art.remove(c); public class childpart extends computer public childpart(string name)super(name);public void getpart()system.out.println(name);composite模式优势和不足模式优势和不足 composite模式采用树形结构来实现普遍存在的对象容器,从而将模式采用树形结构来实现普遍存在的对象容器,从而将“一对多一对多”的关系转化为的关系转化为“一对一一对一”的关系,的关系, 将将“客户代码与复杂的对象容器结构客户代码与复杂的对象容器结构”解耦解耦 ,解耦

23、之后,客户端,解耦之后,客户端代码将与纯粹的抽象接口,而非对象容器的复内部实现结构,发生代码将与纯粹的抽象接口,而非对象容器的复内部实现结构,发生依赖关系,从而更能依赖关系,从而更能“应对变化应对变化”。 composite模式中,是将模式中,是将“add和和remove等和对象容器相关的方法等和对象容器相关的方法”定义在定义在“表示抽象对象的表示抽象对象的component类类”中,还是将其定义在中,还是将其定义在“表表示对象容器的示对象容器的composite类类”中,是一个关乎中,是一个关乎“透明性透明性”和和“安全安全性性”的两难问题,需要仔细权衡。这里有可能违背面向对象的的两难问题,

24、需要仔细权衡。这里有可能违背面向对象的“单单一职责原则一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。,但是对于这种特殊结构,这又是必须付出的代价。 bridge模式优点和不足:模式优点和不足: composite模式在具体实现中,可以让父对象中的子对象反向追溯模式在具体实现中,可以让父对象中的子对象反向追溯 decorator模式模式 decorator模式即装饰模式,是指动态的给一个对象添加一些额外的职责,模式即装饰模式,是指动态的给一个对象添加一些额外的职责,在在java 的的io操作中,经常会用到诸如如下的语句:操作中,经常会用到诸如如下的语句: 模式介绍模式介绍 主要适用于

25、以下情况:主要适用于以下情况: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加在不影响其他对象的情况下,以动态、透明的方式给单个对象添加方法。或者处理那些可以撤消的方法。方法。或者处理那些可以撤消的方法。 当不能采用生成子类的方式进行扩充时。当不能采用生成子类的方式进行扩充时。bufferedreader br = new bufferedreader(new inputstreamreader(new fileinputstream(new file(d:a.txt);while(br.readline()!=null)system.out.println(br.readline

26、();在该代码中使用多个的在该代码中使用多个的decorator被层叠在一起,最后得到一个功能强大被层叠在一起,最后得到一个功能强大的流。既能够被缓冲,又能够得到行数,的流。既能够被缓冲,又能够得到行数, decorator模式结构图模式结构图装饰模式结构图如下: component:定义一个对象接口,以规范准备接收附加责任的对象。:定义一个对象接口,以规范准备接收附加责任的对象。 concretecomponent:定义一个将要接收附加责任的类。:定义一个将要接收附加责任的类。 decorator:持有一个组件对象的实例,并定义一个与抽象组件接:持有一个组件对象的实例,并定义一个与抽象组件接

27、口一致的接口。口一致的接口。 concretedecorator:负责给组件对象:负责给组件对象“贴上贴上”附加的责任。附加的责任。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) th

28、is.phone=phone; public void use( ) phone.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)

29、;public void use( )phone.use( );system.out.println(装配可视功能装配可视功能); 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

30、autodecorator(p);p2.use();decorator模式优势和不足模式优势和不足 decorator模式主要有以下几点优势:模式主要有以下几点优势:比静态继承更灵活。比静态继承更灵活。 避免了在层次结构中高层的类有太多的特性。避免了在层次结构中高层的类有太多的特性。decorator模式提供了一模式提供了一种种“即用即付即用即付”的方法来添加职责。的方法来添加职责。 decorator模式的不足之处主要在于有太多的小对象。采用模式的不足之处主要在于有太多的小对象。采用decorator模式模式进行设计往往会产生许多看上去类似的小对象,这些对象仅仅在它们相互进行设计往往会产生许

31、多看上去类似的小对象,这些对象仅仅在它们相互连接的方式上有所不同,所以在排错时会很困难。连接的方式上有所不同,所以在排错时会很困难。 decorator模式不足模式不足facade模式模式 facade模式(外观模式)的意图是:为子系统中的一组接口提供一致的模式(外观模式)的意图是:为子系统中的一组接口提供一致的界面,界面,facade模式定义了一个高层接口,这个接口使得这一子系统更加模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。容易使用。 模式介绍模式介绍 主要适用于以下情况:主要适用于以下情况: 当要为一个复杂子系统提供一个简单接口时。当要为一个复杂子系统提供一个简单接口时。

32、 客户程序与抽象类的实现部分之间存在着很大的依赖性。客户程序与抽象类的实现部分之间存在着很大的依赖性。 当需要构建一个层次结构的子系统时,使用当需要构建一个层次结构的子系统时,使用facade模式定义子系模式定义子系统中每层的入口点。统中每层的入口点。 facade模式结构图模式结构图外观模式结构图如下: facade:知道哪些子系统类负责处理请求,将客户的请求代理给:知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。适当的子系统对象。 子系统类(子系统类(subsystem classes):实现子系统的功能,处理由):实现子系统的功能,处理由facade对象指派的任务。对象

33、指派的任务。 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

34、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;pub

35、lic void 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 +数据库已成功!数

36、据库已成功!);return cn; catch (exception e) system.out.println(信息提示:连接信息提示:连接 + servername + 服务器服务器+ dbname +失败!失败!n + e);return null;facade模式优势和不足模式优势和不足 facade模式主要有以下几点优势:模式主要有以下几点优势:对客户屏蔽子系统组件,因而减少了客户处理的对象的数目,使得子对客户屏蔽子系统组件,因而减少了客户处理的对象的数目,使得子系统使用起来更加方便。系统使用起来更加方便。 实现了子系统与客户间的松耦合关系。松耦合关系使得子系统的组实现了子系统与客

37、户间的松耦合关系。松耦合关系使得子系统的组件变化不会影响到客户端。件变化不会影响到客户端。 facade模式不足模式不足facade模式的缺点主要在于使用模式的缺点主要在于使用facade模式时,要定义模式时,要定义interface是很麻是很麻烦的一件事情,特别是在内部类所能提供的方法还没确定或外部所需功烦的一件事情,特别是在内部类所能提供的方法还没确定或外部所需功能还没确定的时候尤为如此。能还没确定的时候尤为如此。 flyweight模式模式 flyweight模式即享元模式,该模式的意图是避免大量拥有相同内容的小模式即享元模式,该模式的意图是避免大量拥有相同内容的小类的开销(如耗费内存)

38、,使大家共享一个类(元类)。类的开销(如耗费内存),使大家共享一个类(元类)。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内部状态和外部状态。享的关键是区分内部状态和外部状态。flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。应用场合很多,比如你要从一个数据库中读取一系列字符串,这行速度。应用场合很多,比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在些字符串中有许多

39、是重复的,那么我们可以将这些字符串储存在flyweight池池(pool)中。中。 模式介绍模式介绍 当以下情况都成立时使用当以下情况都成立时使用flyweight模式:模式: 一个应用程序使用了大量的对象。一个应用程序使用了大量的对象。 由于使用了大量的对象,造成很大的开销。由于使用了大量的对象,造成很大的开销。 如果删除对象的外部状态,就可以使用相对较少的共享对象来取如果删除对象的外部状态,就可以使用相对较少的共享对象来取代很多组对象。代很多组对象。 应用程序不依赖于对象标识。应用程序不依赖于对象标识。 flyweight模式结构图模式结构图享元模式结构图如下: flyweight:描述一

40、个接口,通过这个接口:描述一个接口,通过这个接口flyweight示例对象可示例对象可接受并作用于外部状态。接受并作用于外部状态。 unsharedconcreteflyweight:并非所有的:并非所有的flyweight子类都需要被共享,子类都需要被共享, unsharedconcreteflyweight对象通常将对象通常将concreteflyweight对象作为子节对象作为子节点。点。 flyweightfactory:创建并管理:创建并管理flyweight对象,确保合理的共享对象,确保合理的共享flyweight 。concreteflyweight:实现:实现flyweight

41、接口,并为内部状态添加存储空间。接口,并为内部状态添加存储空间。 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-flyweight : + str

42、ing);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(

43、);flyweights.put(obj, flyweight);return flyweight;public int getflyweightsize()return flyweights.size();flyweightfactory对象提供了对象提供了一个已创建的实例,如果该实一个已创建的实例,如果该实例没有,例没有,flyweightfactory对对象就创建一个。象就创建一个。 flyweight模式优势和不足模式优势和不足 flyweight模式优势:模式优势:flyweight模式不足:模式不足:flyweight模式主要是对存储的节约,共享的模式主要是对存储的节约,共享的fl

44、yweight越多,存储节约也越多,存储节约也就越多,节约量随着共享状态的增多而增大。可以使用两种方法来节约就越多,节约量随着共享状态的增多而增大。可以使用两种方法来节约存储,即使用共享来减少内部状态的消耗和用计算时间换取对外部状态存储,即使用共享来减少内部状态的消耗和用计算时间换取对外部状态的存储。的存储。 使用该模式时,传输、查找和计算外部状态都会产生运行时的开销,尤使用该模式时,传输、查找和计算外部状态都会产生运行时的开销,尤其当其当flyweight对象原先被存储为内部状态时,开销会更大。对象原先被存储为内部状态时,开销会更大。 proxy模式模式proxy 模式中要创建模式中要创建“

45、stub”或或“surrogate”对象,它们的目的是接受请求对象,它们的目的是接受请求并把请求转发到实际执行工作的其他对象。并把请求转发到实际执行工作的其他对象。比如远程方法调用(比如远程方法调用(rmi)利用)利用proxy模式,使得在其他模式,使得在其他jvm中执行的对中执行的对象就像本地对象一样;象就像本地对象一样;proxy模式在实际中经常应用,比如模式在实际中经常应用,比如windows系统提供的快捷方法。系统提供的快捷方法。 模式介绍模式介绍 该模式主要有以下几种情况:该模式主要有以下几种情况: 远程代理(远程代理(remote proxy):在不同的地址空间中提供局部代表。):

46、在不同的地址空间中提供局部代表。 虚代理(虚代理(virtual proxy):根据需要创建开销很大的对象。):根据需要创建开销很大的对象。 智能指引(智能指引(smart reference):取代简单指针。):取代简单指针。 保护代理(保护代理(protection proxy):控制对原始对象的访问。):控制对原始对象的访问。proxy模式结构图模式结构图代理模式结构图如下: subject:定义:定义realsubject和和proxy的共用接口,这样就在任何使用的共用接口,这样就在任何使用realsubject的地方都可以使用的地方都可以使用proxy。 realsubject:定义

47、:定义proxy所代表的实体。所代表的实体。 proxy:保存一个引用使得代理可以访问实体。控制对实体的存取,并可:保存一个引用使得代理可以访问实体。控制对实体的存取,并可能负责创建和删除它,其他功能依赖于代理的类型。能负责创建和删除它,其他功能依赖于代理的类型。 proxy模式示例模式示例abstract interface subjectabstract public void request();class realsubject implements subjectpublic void request()system.out.println(hello world!);class p

48、roxysubject 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(

49、代理角色即将调用真实对象的代理角色即将调用真实对象的request()方法方法); private void postrequest()system.out.println(调用真实对象的调用真实对象的request()方法结束方法结束); 客户段可通过如下的代码客户段可通过如下的代码访问真实对象的方法访问真实对象的方法:subject sub=new proxysubject();sub.request(); java动态代理类动态代理类 static class getproxyclass (classloader loader, class interfaces):获得:获得一个代理类,

50、其中一个代理类,其中loader是类装载器,是类装载器,interfaces是真实类所拥有的全部接是真实类所拥有的全部接口的数组。口的数组。 java.lang.reflect类库中提供三个类直接支持代理模式:类库中提供三个类直接支持代理模式:proxy,invocationhandler和和method。 proxy类:该类即为动态代理类。主要有如下主要方法:类:该类即为动态代理类。主要有如下主要方法: protected proxy(invocationhandler h):构造函数,用于给内部的:构造函数,用于给内部的h赋值。赋值。 static object newproxyinstance(cla

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论