java设计优化--代理模式

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

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

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

1.静态代理实现:

主题接口:

1 public interface IDBQuery {
2     String request();
3 }

真实主题:

 1 public class DBQuery implements IDBQuery {
 2     public DBQuery(){
 3         try {
 4             Thread.sleep(10000);
 5         } catch (Exception e) {
 6             e.printStackTrace();
 7         }
 8     }
 9     public String request() {
10         return "string request";
11     }
12 }

代理类:

1 public class IDBQueryProxy implements IDBQuery {
2     private DBQuery dbquery;
3     public String request() {
4         if(dbquery==null)
5             dbquery = new DBQuery();
6         return dbquery.request();
7     }
8 }

最后,主函数:

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

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

动态代理:

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

主题接口:

1 public interface IDBQuery {
2     String request();
3 }

jdk代理类:

 1 public class JdbDbqueryHandler implements InvocationHandler{
 2     IDBQuery idbquery = null;
 3     @Override
 4     public Object invoke(Object proxy, Method method, Object[] args)
 5             throws Throwable {
 6         if(idbquery==null){
 7             idbquery = new DBQuery();
 8         }
 9         return idbquery.request();
10     }
11     public static IDBQuery createJdbProxy(){
12         IDBQuery jdkProxy = (IDBQuery) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
13                 new Class[]{IDBQuery.class}, new JdbDbqueryHandler());
14         System.out.println("JdbDbqueryHandler.createJdbProxy()");
15         return jdkProxy;
16     }
17
18 }

主函数:

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

另外,也可以使用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()方法,通过反射生成动态类实例,并返回该实例。其他与该过程细节不同,但是生成逻辑相同。

时间: 2024-10-22 19:54:11

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

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

JAVA设计模式(3)----代理模式

1.  什么是代理模式?Proxy Pattern 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 通俗的讲,代理模式就是我很忙没空理你,你要想找我可以先找我的代理人,代理人和被代理人继承同一个接口.代理人虽然不能干活,但是被代理的人可以干活. 这个例子中有水浒传中的这么几个人:名垂青史的潘金莲,王婆,西门大官人.西门庆想要找潘金莲,需要找王婆做代理.首先定义一个接口:Kin

java设计模式6——代理模式

java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代理 动态代理 1.3.代理模式关系图(以租房子为例) 2.静态代理 2.1.角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理客户:代理真实角色.代理真实角色后,我们一般会做一些附属的操作 客户:访问代理对象的人 2.2.例1(租房子演示) 2.2.1.抽象角色实现(

Java设计模式:代理模式(一)

问题的提出 现在生活中,常常在微信朋友圈里面看到代购的信息,你想在国外买什么,香港买什么,但是又懒得自己过去,于是常常委托别人帮忙买奶粉买那啥的.这类问题的缘由是因为客户和原产地没有直接的接触,所以需要一个代理(代购)的第三者来实现间接引用.代理对象可以在客户端和目标对象间起到中介作用,而且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务.代理模式是一种很好实现客户对象与代理对象分离的策略.其抽象UML图如下图 代理模式包含如下角色 ISubject:抽象主题角色,是一个接

Java设计模式——Proxy(代理)模式

Proxy(代理)模式为对象提供一个代理或者占位来控制对该对象的访问. 图像代理 使用Proxy模式的设计有时非常脆弱,它们依赖转发方法来调用其底层对象.转发可能会建立一个非常脆弱并且需要经常维护的设计. load()方法以JFrame对象为参数,用于在指定图像加载完毕之后进行回调.在执行load()方法的时候,它先以LOADING引用的图像对象为参数调用setImage(),然后重新绘制图形显示窗口,最后为自己启动一个单独的线程.而run()方法是在单独的线程中执行的,该方法根据构造器中指定的

Java设计模式之代理模式(Proxy)

前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils 的task也是通过代理模式来访问的.为何要采用代理模式呢?有什么好处呢?抱着这些疑问!今天来学习总结一下. 什么是代理模式? 代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用.举例说明,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个

Java与设计模式-代理模式

代理模式也称为委托模式,属于结构型设计模式,为其他对象提供一种代理,以控制对这个对象的访问.这么听起来很难理解,生活中代理的例子也是很多的,毕业了要找房子,怎样又快又好的找到自己心仪的房子,必须通过租房代理:想要买火车票,火车站太远,我们可以选择代理点进行购票.代码模式的UML类图如下: 应用场景:当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口.下面我们以"秋菊打官司"为例,讲解一下代

Java记录 -90- 静态代理模式深度剖析

代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理地下可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及到三个角色: 1.抽象角色:声明真实对象和代理对象的共同接口: 2.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他操作,相当于对真实对象进行封装: 3.真实角色

Java中的代理模式

1.什么是代理模式 代理模式:就是为其他对象提供一种代理以控制对这个对象的访问. 代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能). 举个例子来说明代理的作用: 一般我们想邀请明星来当我们的代言人,我们并不能直接联系到明星,而是通过其经纪人,来告诉经纪人我们需要和明星进行合作,然后通过经纪人来转达给明星.,明星只需要做好代言工作就好,其他繁琐的事情就交于经纪人就可以.这里的经经纪人就是一个代理对象,明星就是一个目标对象. 用图表示如下: 2.三种代理模式  2.1 静态代理 静态