java设计优化之代理模式_java

代理模式使用代理对象完成用户的请求,屏蔽用户对真实对象的访问。

代理模式的用途很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象;或者在远程调用中,需要使用代理对象处理远程方法中的技术细节;或者为了提升系统,对真是对象进行封装,从而达到延迟加载的目的。

在系统启动时,将消耗资源最多的方法使用代理模式分离,就可以加快系统的启动速度,减少用户的等待时间。在用户真正在做查询是,再由代理类加载真实的类,完成用户请求。这就是使用代理模式达到延迟加载的目的。

1.静态代理实现:

主题接口:

public interface IDBQuery {
   String request();
 }

真实主题:

public class DBQuery implements IDBQuery {
  public DBQuery(){
    try {
      Thread.sleep(10000);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public String request() {
    return "string request";
  }
}

代理类:

public class IDBQueryProxy implements IDBQuery {
  private DBQuery dbquery;
  public String request() {
    if(dbquery==null)
      dbquery = new DBQuery();
    return dbquery.request();
  }
}

最后,主函数:

public class ProxyText {
  public static void main(String[] args) {
    IDBQuery dbquery = new IDBQueryProxy();
    System.out.println(dbquery.request());
  }
}

静态代理注意,代理类是真实类实现共同的接口,并且代理类引用真实类对象,将耗时操作放在代理类方法中实现。

动态代理:

动态代理即运行时,动态生成代理类。即:代理类的字节码在运行时生成并载入当前的classloader。与静态代理相比,动态代理不需要为真实注意封装一个形式上完全一样的封装类,假如主题接口很多,就要为每一个接口写一个代理方法是很烦人的,如果接口有变动,真实类和代理类都需要变化,这样不利于系统维护;其次,使用一些动态代理的生成方法甚至可以在运行是指定代理类的执行逻辑,从而大大提高的系统的灵活性。

主题接口:

public interface IDBQuery {
   String request();
 }

jdk代理类:

public class JdbDbqueryHandler implements InvocationHandler{
  IDBQuery idbquery = null;
  @Override
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    if(idbquery==null){
      idbquery = new DBQuery();
    }
    return idbquery.request();
  }
  public static IDBQuery createJdbProxy(){
    IDBQuery jdkProxy = (IDBQuery) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
        new Class[]{IDBQuery.class}, new JdbDbqueryHandler());
    System.out.println("JdbDbqueryHandler.createJdbProxy()");
    return jdkProxy;
  }

}

主函数:

public class ProxyText {
  public static void main(String[] args) {
    IDBQuery idbQuery = JdbDbqueryHandler.createJdbProxy();
    System.out.println(idbQuery.request());
  }
}

另外,也可以使用CGLIB和javassist动态代理与jdk动态代理类似,但是jdk动态类的创建过程最快,因为这个内置实现的difineclass()方法被定义为native实现,故性能优于其他。在代理类的函数调用上,JDK的动态代理不如CGLIB和javassist动态代理,而javassist动态代理性能质量最差,甚至不如JDK的实现。在实际开发应用中,代理类的方法调用频率要远远高于代理类的实际生成频率,故动态代理的方法调用性能应该成为性能的关注点。JDK动态代理强制要求代理类和真是主题实现统一接口,CGLIB和javassist动态代理没有这样的要求。

在java中,动态代理的实现涉及到classloader的使用,以CGLIB为例,简要描述下动态类的加载过程。使用CGLIB生成动态代理,首先需要生成Enhancer类的实例,并制定用于处理代理业务的回调类。在enhancer.create()方法中,会使用DefaultGeneratorStrategy.Generate()方法生成代理类的字节码,并保存在byte数组中。接着调用reflectUtils.defineClass()方法,通过反射,调用ClassLoader.defineClass()方法,将字节码装载到classloader中,完成类的加载。最后,通过reflectUtils.newInstance()方法,通过反射生成动态类实例,并返回该实例。其他与该过程细节不同,但是生成逻辑相同。

以上就是本文的全部内容,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java设计优化
java代理模式
代理设计模式 java、java动态代理设计模式、java 代理模式、java 代理模式详解、动态代理模式 java,以便于您获取更多的相关知识。

时间: 2024-07-28 12:24:53

java设计优化之代理模式_java的相关文章

java设计优化之单例模式_java

单例模式是一种对象创建模式,确保系统中一个类只有一个实例. 在java语言中,这样做有两大好处: 1.对于频繁使用的对象,可以省略创建对象所话费的时间: 2.由于new操作的次数减少,对于系统内存的使用频率降低,这样减少GC的压力,缩短GC停顿的时间. 单例模式细分: 1. public class Singleton{ private Singleton(){ System.out.println("Singleton.Singleton()"); } private static

Java的三种代理模式简述

Java的三种代理模式简述 本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇文章中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 假如你希望,通过你的某种方式生产出来的歌手对象,在唱歌前后还要想观众问好和答谢,也即对目标对象Singer的sing方法进行功能扩展. 但是往往你又不能直接对源代码进行修改

轻松掌握Java代理模式_java

和大家一起聊一聊java代理模式 1.静态代理 1.1静态代理的代理类和和被代理的类都要维护一个共同的接口.  public interface IUserDao { void save(); } 1.2被代理的类,目标对象  public class UserDao implements IUserDao{ @Override public void save() { System.out.println("-----已经保存数据!!!------"); } } 1.3代理对象  p

详解java动态代理模式_java

本文针对java动态代理进行知识点整理,具体内容如下 一. JAVA的动态代理(比较官方说法) 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提 供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工

Java设计模式之虚拟代理模式

虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成,应用启动的时候,不会立即使用所有的对象.在这种情况下,虚拟代理模式建议推迟对象的创建直到应用程序需要它为止.对象被应用第一次引用时创建并且同一个实例可以被重用.这种方法优缺点并存. 优点: 这种方法的优点是,在应用程序启动时,由于不需要创建和装载所有的对象,因此加速了应用程序的启动. 缺点: 因为不能保证特

Java设计模式之计数代理模式

描述: 计数代理模式在客户对象调用服务提供者对象上方法的前后执行诸如日志(logging)和计数(counting)一系列附加功能时很有用.计数代理模式建议把这些附加功能封装在一个单独的对象,这个对象就是指计数代理对象,而不是把这些附加的功能实现放到服务提供者的内部.良好的对象设计的一个特征就是对象要专注于提供特定的功能.换句话说,理想的对象不应该做各种不相干的事情.把诸如日志(logging)和计数(counting)等类似的功能封装为一个单独的对象,而让服务提供者对象仅提供它自己的特定功能.

java设计模式之工厂方法模式_java

概要 设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美. 定义 定义一个用于创建对象的接口,让其子类去决定实例化那个类 使用场景 任何使用复杂对象的地方,都可以使用工厂模式 UML 1.抽象工厂  抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等 所以可以用一个简单的方法概括,就是create(); 2.具体汽车制造厂  具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等

java设计模式之中介者模式_java

中介者模式 面向对象设计鼓励将行为分布到各个对象中, 这种分布可能会导致对象间有许多连接. 在最坏的情况下, 每一个对象都需要知道其他所有对象. 虽然将一个系统分割成许多对象可增强可复用性, 但是对象间相互连接的激增又会降低其可复用性. 大量的连接关系使得一个对象不可能在没有其他对象的协助下工作(系统表现为一个不可分割的整体), 此时再对系统行为进行任何较大改动就十分困难. 因为行为被分布在许多对象中, 结果是不得不定义很多子类以定制系统的行为. 由此我们引入了中介者对象Mediator:  

详解Java编程中的策略模式_java

策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.用一句话来说,就是:"准备一组算法,并将每一个算法封装起来,使得它们可以互换".下面就以一个示意性的实现讲解策略模式实例的结构. 这个