《chapter09_GoF设计模式_结构型模式3.ppt》由会员分享,可在线阅读,更多相关《chapter09_GoF设计模式_结构型模式3.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9 9讲讲w w享元模式享元模式w w代理模式代理模式本讲教学内容w享元模式 模式动机与定义模式动机与定义 模式结构与分析模式结构与分析 模式实例与解析模式实例与解析 模式效果与应用模式效果与应用 模式扩展模式扩展享元模式w模式动机面向对象技术可以很好地解决一些灵活性或可扩展性问面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下当对象数量太多时,将导致运行代价过高,带来性能下降等问题降等问题。享元模式享元模式正是为解决这一类问题而诞生的。正是为解
2、决这一类问题而诞生的。享元模式通享元模式通过共享技术实现相同或相似对象的重用。过共享技术实现相同或相似对象的重用。享元模式w模式动机享元模式w模式动机在享元模式中在享元模式中可以共享的相同内容称为内部状态可以共享的相同内容称为内部状态(Intrinsic State),而那些,而那些需要外部环境来设置的不能共享的内容称为需要外部环境来设置的不能共享的内容称为外部状态外部状态(Extrinsic State),由于区分了内部状态和外部状,由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内
3、部状态是可以共享的。具有一些不同的特征,而相同的内部状态是可以共享的。在享元模式中通常会出现工厂模式,需要在享元模式中通常会出现工厂模式,需要创建一个享元工厂创建一个享元工厂来负责维护一个享元池来负责维护一个享元池(Flyweight Pool)用于存储具有相同用于存储具有相同内部状态的享元对象内部状态的享元对象。享元模式w模式动机在享元模式中共享的是享元对象的内部状态,外部状态在享元模式中共享的是享元对象的内部状态,外部状态需要通过环境来设置。在实际使用中,能够共享的内部需要通过环境来设置。在实际使用中,能够共享的内部状态是有限的,因此状态是有限的,因此享元对象一般都设计为较小的对象,享元对
4、象一般都设计为较小的对象,它所包含的内部状态较少,这种对象也称为细粒度对象它所包含的内部状态较少,这种对象也称为细粒度对象。享元模式的目的就是使用共享技术来实现大量细粒度对享元模式的目的就是使用共享技术来实现大量细粒度对象的复用象的复用。享元模式w模式定义享元模式享元模式(Flyweight Pattern):运用:运用共享技术共享技术有效地有效地支持大量支持大量细粒度对象细粒度对象的复用。系统只使用少量的对象,的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小而这些对象都很相似,状态变化很小,可以实现对象的,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细多次复用。
5、由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为粒度对象,因此它又称为轻量级模式轻量级模式,它是一种,它是一种对象结对象结构型模式构型模式。享元模式w模式定义Flyweight Pattern:Use sharing to support large numbers of fine-grained objects efficiently.Frequency of use:low 享元模式w模式结构享元模式w模式结构享元模式包含如下角色:享元模式包含如下角色:Flyweight:抽象享元类ConcreteFlyweight:具体享元类UnsharedConcreteFlyweight
6、:非共享具体享元类FlyweightFactory:享元工厂类享元模式w模式分析享享元元模模式式是是一一个个考考虑虑系系统统性性能能的的设设计计模模式式,通通过过使使用用享元模式可以享元模式可以节约内存空间,提高系统的性能节约内存空间,提高系统的性能。享元模式w模式分析享元模式的核心在于享元模式的核心在于享元工厂类享元工厂类,享元工厂类的作用享元工厂类的作用在于提供一个用于存储享元对象的享元池在于提供一个用于存储享元对象的享元池,用户需要,用户需要对象时,首先从享元池中获取,对象时,首先从享元池中获取,如果享元池中不存在,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中则创建
7、一个新的享元对象返回给用户,并在享元池中保存该新增对象。保存该新增对象。享元模式w模式分析典型的享元工厂类代码:典型的享元工厂类代码:public class FlyweightFactoryprivate HashMap flyweights=new HashMap();public Flyweight getFlyweight(String key)if(flyweights.containsKey(key)return(Flyweight)flyweights.get(key);elseFlyweight fw=new ConcreteFlyweight();flyweights.put
8、(key,fw);return fw;享元模式w模式分析享元模式以共享的方式高效地支持大量的细粒度对象,享元对象享元模式以共享的方式高效地支持大量的细粒度对象,享元对象能做到共享的关键是区分能做到共享的关键是区分内部状态内部状态(Internal State)和和外部状态外部状态(External State)。(1)内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,因此内部状态可以共享。(2)外部状态是随环境改变而改变的、不可以共享的状态。享元对象的外部状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。一个外部状态与另一个外部状态之间是相互独立的。
9、享元模式w模式分析典型的享元类代码:典型的享元类代码:public class Flyweight /内部状态作为成员属性private String intrinsicState;public Flyweight(String intrinsicState)this.intrinsicState=intrinsicState;public void operation(String extrinsicState).享元模式w享元模式实例与解析实例一:共享网络设备(无外部状态)实例一:共享网络设备(无外部状态)很多网络设备都是支持共享的,如交换机、集线器等,多台终端计算机可以连接同一台网络设备
10、,并通过该网络设备进行数据转发,如图所示,现用享元模式模拟共享网络设备的设计原理。享元模式w享元模式实例与解析实例一:共享网络设备(无外部状态)实例一:共享网络设备(无外部状态)享元模式w享元模式实例与解析实例二:共享网络设备(有外部状态)实例二:共享网络设备(有外部状态)虽然网络设备可以共享,但是分配给每一个终端计算机的端口(Port)是不同的,因此多台计算机虽然可以共享同一个网络设备,但必须使用不同的端口。我们可以将端口从网络设备中抽取出来作为外部状态,需要时再进行设置。享元模式w享元模式实例与解析实例二:共享网络设备(有外部状态)实例二:共享网络设备(有外部状态)享元模式w模式优缺点享元
11、模式的优点享元模式的优点享元模式的优点在于它可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份。享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。享元模式w模式优缺点享元模式的缺点享元模式的缺点享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。享元模式w模式适用环境在以下情况下可以使用享元模式:在以下情况下可以使用享元模式:一个系统有大量相同或者相似的对象,由于这类对象的大量使用,造成内存的大量耗费。对象的大部分状
12、态都可以外部化,可以将这些外部状态传入对象中。使用享元模式需要维护一个存储享元对象的享元池,而这需要耗费资源,因此,应当在多次重复使用享元对象时才值得使用享元模式。享元模式w模式应用(1)享元模式在享元模式在编辑器软件编辑器软件中大量使用,如在一个文中大量使用,如在一个文档中多次出现相同的图片,则只需要创建一个图片对档中多次出现相同的图片,则只需要创建一个图片对象,通过在应用程序中设置该图片出现的位置,可以象,通过在应用程序中设置该图片出现的位置,可以实现该图片在不同地方多次重复显示。实现该图片在不同地方多次重复显示。享元模式w模式应用(2)在在JDK类库中定义的类库中定义的String类使用
13、了享元模式。类使用了享元模式。public class Demopublic static void main(String args)String str1=abcd;String str2=abcd;String str3=ab+cd;String str4=ab;str4+=cd;System.out.println(str1=str2);System.out.println(str1=str3);System.out.println(str1=str4);享元模式w模式扩展单纯享元模式和复合享元模式单纯享元模式和复合享元模式 单纯享元模式单纯享元模式:在单纯享元模式中,所有的享元对象都
14、是可以共享的,即所有抽象享元类的子类都可共享,不存在非共享具体享元类。享元模式w模式扩展单纯享元模式和复合享元模式单纯享元模式和复合享元模式 复合享元模式复合享元模式:将一些单纯享元使用组合模式加以组合,可以形成复合享元对象,这样的复合享元对象本身不能共享,但是它们可以分解成单纯享元对象,而后者则可以共享。享元模式w模式扩展享元模式与其他模式的联用享元模式与其他模式的联用 在享元模式的享元工厂类中通常提供一个静态的工厂方法用于返回享元对象,使用简单工厂模式来生成享元对象。在一个系统中,通常只有唯一一个享元工厂,因此享元工厂类可以使用单例模式进行设计。享元模式可以结合组合模式形成复合享元模式,统
15、一对享元对象设置外部状态。代理模式代理模式w代理模式 模式动机与定义模式动机与定义 模式结构与分析模式结构与分析 模式实例与解析模式实例与解析 模式效果与应用模式效果与应用 模式扩展模式扩展代理模式w模式动机在在某某些些情情况况下下,一一个个客客户户不不想想或或者者不不能能直直接接引引用用一一个个对对象象,此此时时可可以以通通过过一一个个称称之之为为“代代理理”的的第第三三者者来来实实现现间间接接引引用用。代代理理对对象象可可以以在在客客户户端端和和目目标标对对象象之之间间起起到到中中介介的的作作用用,并并且且可可以以通通过过代代理理对对象象去去掉掉客客户户不不能能看看到到的内容和服务或者添加
16、客户需要的额外服务的内容和服务或者添加客户需要的额外服务。代理模式w模式动机代理模式w模式动机代理模式w模式动机通过通过引入一个新的对象引入一个新的对象(如小图片和远程代理对(如小图片和远程代理对象)象)来实现对真实对象的操作或者将新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身作为真实对象的一个替身,这种实现机制即为,这种实现机制即为代理模式,代理模式,通过引入代理对象来间接访问一个通过引入代理对象来间接访问一个对象对象,这就是代理模式的模式动机。,这就是代理模式的模式动机。代理模式w模式定义代理模式代理模式(Proxy Pattern):给某一个对象:给某一个对象提供一个
17、代提供一个代理理,并,并由代理对象控制对原对象的引用由代理对象控制对原对象的引用。代理模式的英。代理模式的英文叫做文叫做Proxy或或Surrogate,它是一种,它是一种对象结构型模式对象结构型模式。代理模式w模式定义Proxy Pattern:Provide a surrogate or placeholder for another object to control access to it.Frequency of use:medium high 代理模式w模式结构代理模式w模式结构代理模式包含如下角色:代理模式包含如下角色:Subject:抽象主题角色Proxy:代理主题角色Rea
18、lSubject:真实主题角色代理模式w模式分析代代理理模模式式示示意意结结构构图图比比较较简简单单,一一般般可可以以简简化化为为如如下下图图所所示示,但但是在现实中要复杂很多。是在现实中要复杂很多。代理模式w模式分析典型的代理类实现代码:典型的代理类实现代码:public class Proxy implements Subject private RealSubject realSubject=new RealSubject();public void preRequest().public void request()preRequest();realSubject.request();
19、postRequest();public void postRequest()代理模式w代理模式实例与解析实例一:论坛权限控制代理实例一:论坛权限控制代理 在一个论坛中已注册用户和游客的权限不同,已注册的用户拥有发帖、修改自己的注册信息、修改自己的帖子等功能;而游客只能看到别人发的帖子,没有其他权限。使用代理模式来设计该权限管理模块。在本实例中我们使用代理模式中的保护代理,该代理用于控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。代理模式w代理模式实例与解析实例一:论坛权限控制代理实例一:论坛权限控制代理 代理模式w代理模式实例与解析实例二:数学运算代理实例二:数学运算代理 模拟
20、应用远程代理来访问另外一个应用程序域中的对象,如果在远程实现了加减乘除等运算,在本地需要调用,那么可以考虑在本地设置一个代理。代理模式w代理模式实例与解析实例二:数学运算代理实例二:数学运算代理 代理模式w模式优缺点代理模式的优点代理模式的优点代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。保护代理可以控制对真实对象的使用权限。代理模式w模式优缺点代理模式的缺点代
21、理模式的缺点由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。实现代理模式需要额外的工作,有些代理模式的实现非常复杂。代理模式w模式适用环境根据代理模式的使用目的,常见的代理模式有以下几种类型:根据代理模式的使用目的,常见的代理模式有以下几种类型:远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)。虚拟(Virtual)代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会
22、被真正创建。Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。代理模式w模式适用环境根据代理模式的使用目的,代理模式有以下几种类型(续):根据代理模式的使用目的,代理模式有以下几种类型(续):保护(Protect or Access)代理:控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。防火墙(Firewa
23、ll)代理:保护目标不让恶意用户接近。同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等。代理模式w模式应用(1)Java RMI(Remote Method Invocation,远程方法调用,远程方法调用)。代理模式w模式应用(2)EJB、Web Service等分布式技术都是代理模式等分布式技术都是代理模式的应用。的应用。在在EJB中使用了中使用了RMI机制,远程服务器中的机制,远程服务器中的企业级企业级Bean在本地有一个桩代理,
24、客户端通过桩来调在本地有一个桩代理,客户端通过桩来调用远程对象中定义的方法,而无须直接与远程对象交用远程对象中定义的方法,而无须直接与远程对象交互。在互。在EJB的使用中需要提供一个公共的接口,客户的使用中需要提供一个公共的接口,客户端针对该接口进行编程,无须知道桩以及远程端针对该接口进行编程,无须知道桩以及远程EJB的的实现细节。实现细节。代理模式w模式应用(3)Spring 框架中的框架中的AOP技术技术也是代理模式的应用,也是代理模式的应用,在在Spring AOP中应用了中应用了动态代理动态代理(Dynamic Proxy)技术技术。代理模式w模式扩展几种常用的代理模式几种常用的代理模
25、式 图片代理图片代理:一个很常见的代理模式的应用实例就是对大图浏览的控制。用户通过浏览器访问网页时先不加载真实的大图,而是通过代理对象的方法来进行处理,在代理对象的方法中,先使用一个线程向客户端浏览器加载一个小图片,然后在后台使用另一个线程来调用大图片的加载方法将大图片加载到客户端。当需要浏览大图片时,再将大图片在新网页中显示。如果用户在浏览大图时加载工作还没有完成,可以再启动一个线程来显示相应的提示信息。通过代理技术结合多线程编程将真实图片的加载放到后台来操作,不影响前台图片的浏览。代理模式w模式扩展几种常用的代理模式几种常用的代理模式 远程代理远程代理:远程代理可以将网络的细节隐藏起来,使
26、得客户端不必考虑网络的存在。客户完全可以认为被代理的远程业务对象是局域的而不是远程的,而远程代理对象承担了大部分的网络通信工作。代理模式w模式扩展几种常用的代理模式几种常用的代理模式 虚拟代理虚拟代理:当一个对象的加载十分耗费资源的时候,虚拟代理的优势就非常明显地体现出来了。虚拟代理模式是一种内存节省技术,那些占用大量内存或处理复杂的对象将推迟到使用它的时候才创建。在应用程序启动的时候,可以用代理对象代替真实对象初始化,节省了内存的占用,并大大加速了系统的启动时间。代理模式w模式扩展动态代理动态代理 动态代理是一种较为高级的代理模式,它的典型应用就是Spring AOP。在传统的代理模式中,客
27、户端通过Proxy调用RealSubject类的request()方法,同时还在代理类中封装了其他方法(如preRequest()和postRequest(),可以处理一些其他问题。如果按照这种方法使用代理模式,那么真实主题角色必须是事先已经存在的,并将其作为代理对象的内部成员属性。如果一个真实主题角色必须对应一个代理主题角色,这将导致系统中的类个数急剧增加,因此需要想办法减少系统中类的个数,此外,如何在事先不知道真实主题角色的情况下使用代理主题角色,这都是动态代理需要解决的问题。代理模式w模式扩展动态代理动态代理 Java动态代理实现相关类位于java.lang.reflect包,主要涉及两
28、个类:InvocationHandler接口。它是代理实例的调用处理程序实现的接口,该接口中定义了如下方法:public Object invoke(Object proxy,Method method,Object args)throws Throwable;invoke()方法中第一个参数proxy表示代理类,第二个参数method表示需要代理的方法,第三个参数args表示代理方法的参数数组。代理模式w模式扩展动态代理动态代理 Proxy类。该类即为动态代理类,该类最常用的方法为:public static Object newProxyInstance(ClassLoader loade
29、r,Class interfaces,InvocationHandler h)throws IllegalArgumentException。newProxyInstance()方法用于根据传入的接口类型interfaces返回一个动态创建的代理类的实例,方法中第一个参数loader表示代理类的类加载器,第二个参数interfaces表示代理类实现的接口列表(与真实主题类的接口列表一致),第三个参数h表示所指派的调用处理程序类。小结w享元模式运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用,它是一种对象结构型模式。w享元
30、模式包含四个角色:抽象享元类声明一个接口,通过它可以接受并作用于外部状态;具体享元类实现了抽象享元接口,其实例称为享元对象;非共享具体享元是不能被共享的抽象享元类的子类;享元工厂类用于创建并管理享元对象,它针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中。w享元模式以共享的方式高效地支持大量的细粒度对象,享元对象能做到共享的关键是区分内部状态和外部状态。其中内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,因此内部状态可以共享;外部状态是随环境改变而改变的、不可以共享的状态。小结w享元模式主要优点在于它可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一
31、份;其缺点是使得系统更加复杂,并且需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。w享元模式适用情况包括:一个系统有大量相同或者相似的对象,由于这类对象的大量使用,造成内存的大量耗费;对象的大部分状态都可以外部化,可以将这些外部状态传入对象中;多次重复使用享元对象。小结w在代理模式中,要求给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。w代理模式包含三个角色:抽象主题角色声明了真实主题和代理主题的共同接口;代理主题角色内部包含对真实主题的引用,从而可以在任何时候操作真实主题对象;真实主题角色定义了代
32、理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的方法。w代理模式的优点在于能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;其缺点在于由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,并且实现代理模式需要额外的工作,有些代理模式的实现非常复杂。小结w远程代理为一个位于不同的地址空间的对象提供一个本地的代表对象,它使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。w如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建,这个小对象称为虚拟代理。虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。w保护代理可以控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。