`

java设计模式(1)--代理模式及动态代理类

    博客分类:
  • java
阅读更多

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式一般涉及到的角色有:

抽象角色:声明真实对象和代理对象的共同接口;

代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

 适用环境:要获得已经初始化的对象又不能有具体的获得途径时适用。

以下以《Java与模式》中的示例为例:

抽象角色:

abstract   public   class  Subject  {
    abstract   public   void  request(); 
} 

 真实角色:实现了Subject的request()方法。
public   class  RealSubject  extends  Subject  {
     public  RealSubject()  { }  
    
     public   void  request()  {
        System.out.println( " From real subject. " );
    }  
}  


代理角色:
public   class  ProxySubject  extends  Subject  {
     private  RealSubject realSubject;  // 以真实角色作为代理角色的属性

     public  ProxySubject()  { }  


     public   void  request()  {  // 该方法封装了真实对象的request方法
        preRequest();

         if ( realSubject  ==   null  )  {

            realSubject  =   new  RealSubject();
        }  

        realSubject.request();  // 此处执行真实对象的request方法

        postRequest();
    }


  客户端调用:
Subject sub = new  ProxySubject();
Sub.request();

由 以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理 RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。

另 外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个 代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。
 
2.动态代理类

Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:

(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。 这个抽象方法在代理类中动态实现。


(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:

Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。

Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。

Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。

 

所 谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

在使用动态代理类时,我们必须实现InvocationHandler接口,以第一节中的示例为例:


抽象角色(之前是抽象类,此处应改为接口):

public   interface  Subject  {
    abstract   public   void  request();
}  



具体角色RealSubject:
public   class  RealSubject  implements  Subject {

   public  RealSubject() {}

   public   void  request() {
    System.out.println( " From real subject. " );
  }

}  


代理处理器:
import  java.lang.reflect.Method;

import  java.lang.reflect.InvocationHandler;

public   class  DynamicSubject  implements  InvocationHandler  {
   private  Object sub;
   public  DynamicSubject()  {}

   public  DynamicSubject(Object obj)  {
    sub  =  obj;
  }

public  Object invoke(Object proxy, Method method, Object[] args)  throws  Throwable  {
   System.out.println( " before calling  "   +  method);
   method.invoke(sub,args);

   System.out.println( " after calling  "   +  method);
    return   null ;
 }

}

 

该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;此外,在该类还实现了invoke方法,该方法中的

method.invoke(sub,args);

其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类,我们可以在调用之前或之后执行一些相关操作。

客户端:

import  java.lang.reflect.InvocationHandler;
import  java.lang.reflect.Proxy;
import  java.lang.reflect.Constructor;
import  java.lang.reflect.Method;

public   class  Client  {

static   public   void  main(String[] args)  throws  Throwable  {

   RealSubject rs  =   new  RealSubject();  // 在这里指定被代理类
   InvocationHandler ds  =   new  DynamicSubject(rs);
   Class cls  =  rs.getClass();

    // 以下是一次性生成代理
   Subject subject  =  (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),ds );
   subject.request();

}

 

分享到:
评论

相关推荐

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    Java设计模式----通俗易懂版

    Java设计模式是软件工程中的一种重要思想,它总结了在解决特定问题时,程序员们反复使用的一些最佳实践和解决方案。这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者...

    JAVA设计模式例程-代理模式

    在这个"JAVA设计模式例程-代理模式"的压缩包中,我们可以深入学习如何在Java中实现这一模式。 1. **代理模式的基本概念** 代理模式的核心思想是为一个目标对象创建一个代理对象,代理对象在客户端和目标对象之间起...

    Java设计模式-代理模式例子

    在这个“Java设计模式-代理模式例子”中,我们可能能看到如何创建静态代理类,以及如何利用`Proxy`和`InvocationHandler`创建动态代理。源码分析可以帮助我们更好地理解代理模式的实现细节,并能将其运用到自己的...

    java设计模式视频教程-代理模式.rar

    在这个“java设计模式视频教程-代理模式.rar”压缩包中,包含了一部关于代理模式的视频教程,以及相关的课件和示例代码。 代理模式的核心思想是通过代理类来代理原始对象,为原始对象提供一个替代品或占位符,以...

    JAVA设计模式--程序设计--反射--注解--泛型

    Java设计模式、程序设计、反射、注解和泛型是Java开发中的核心概念,它们各自在不同的场景下发挥着重要作用,构建出高效、可维护的软件系统。 首先,Java设计模式是面向对象编程中的一种最佳实践,是解决常见问题的...

    Java设计模式——代理设计模式(静态代理和动态代理)

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在不修改原有对象的基础上,为对象添加额外的功能或者...

    java常用设计模式-代理模式

    Java 设计模式 - 代理模式 代理模式(Proxy Pattern)是一种常用的设计模式,提供了间接访问目标对象的一种方式,即通过代理对象访问目标对象。这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加...

    Java设计模式-代理模式

    总结来说,Java设计模式中的代理模式提供了一种优雅的方式来控制对目标对象的访问,并扩展其功能。动态代理更是使得这一过程更加灵活,降低了代码的维护成本。通过学习和应用代理模式,开发者可以更好地设计和实现...

    JAVA设计模式---100%推荐

    这篇名为"JAVA设计模式---100%推荐"的资源,可能是对Java设计模式的深入解析,旨在帮助开发者更好地理解和应用这些模式。 设计模式通常分为三类:创建型、结构型和行为型。创建型模式涉及对象的实例化过程,如单例...

    JAVA设计模式 代码-图解

    ### JAVA设计模式 代码-图解 #### 1. 设计模式概述 设计模式是一种在特定情境下解决软件设计问题的通用解决方案。它们是经过验证的设计经验总结,可以帮助开发者更好地组织代码,提高软件的可维护性和扩展性。...

    java模式设计--代理模式

    代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,这个代理对象可以在不影响原始对象的情况下,控制或增强原始对象的行为。代理模式的核心在于,它提供了一个与真实主题(即原始对象)相同的接口,...

    【Java设计模式-源码】动态代理模式:实现无缝对象拦截

    动态代理设计模式旨在提供一种灵活的代理机制,能够在运行时为各种接口动态创建代理,从而实现对对象的受控访问或功能增强。 ## 二、详细解释及实际示例 1. **实际示例**: - Mockito是一个流行的Java模拟框架,它...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    JAVA设计模式(java设计)

    Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...

    Java设计模式-图解-附代码

    ### Java设计模式详解 #### 一、概述 Java设计模式是一种在特定场景下解决软件设计问题的方法论。设计模式能够帮助开发者以一种更加系统化、标准化的方式来构建软件系统,提高软件的可维护性和可扩展性。本文档...

    java模式设计-代理模式之动态代理.ppt

    代理模式是一种设计模式,它允许我们在不修改原有对象的情况下,为现有对象添加额外的功能或控制。在Java中,动态代理是代理模式的一种实现方式,它允许我们在运行时创建代理对象,这种方式比静态代理更加灵活。动态...

    java设计模式的应用

    ### Java设计模式的应用 #### 一、引言 在当今快速发展的软件开发领域,Java作为一门功能强大且灵活的语言,不仅拥有丰富的API资源,还能与强大的数据库系统无缝对接。这使得许多开发人员能够以模块化的形式构建...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

Global site tag (gtag.js) - Google Analytics