「java代理模式性能」java实现网络代理
今天给各位分享java代理模式性能的知识,其中也会对java实现网络代理进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、Java代理的作用和实现?
- 2、Java程序性能优化-业务代理模式(1)[1]
- 3、java的代理模式有何用,直接调用用实现类不就行了吗,干嘛多此一举呢。。。。
- 4、java设计模式之代理模式:
- 5、Java程序性能优化-代理模式(5)
Java代理的作用和实现?
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
Java程序性能优化-业务代理模式(1)[1]
业务代理模式( )
Value Object模式是将远程调用的传递数据封装在一个串行化的对象中进行传输 而业务代理模式则是将一组由远程方法调用构成的业务流程 封装在一个位于展示层的代理类中 比如 如果用户需要修改一个订单 订单修改操作可细分为 个子操作
校验用户
获取旧的订单信息
更新订单
系统结构如图 所示
图 展示层与业务逻辑层交互示例
以上结构存在两个问题
( )当展示层存在大量并发线程时 这些线程都会直接进行远程方法调用 进而会加重网络负担
( )由于缺乏对订单修改操作流程的有效封装 如果将来修改流程发生变化 那么展示层组件需要修改
为了有效地解决以上两个问题 可以在展示层中加入业务代理对象 业务代理对象负责和远程服务器通信 完成订单修改操作 而业务代理对象本身只暴露简单的updateOrder()订单修改操作供展示层组件使用 修改后的结构如图 所示
图 业务代理模式架构图
注意 业务代理模式将一些业务流程封装在前台系统 为系统性能优化提供了基础平台 在业务代理中 不仅可以复用业务流程 还可以视情况为展示层组件提供缓存等功能 从而减少远程方法调用次数 降低系统压力
lishixinzhi/Article/program/Java/gj/201311/27810
java的代理模式有何用,直接调用用实现类不就行了吗,干嘛多此一举呢。。。。
使用代理类可以在实现类的基础上进行扩展,可以在方法中动态加入代码。这里要理解的是,实现类和代理类都是继承了同一个接口的(必须的)举个例子,如果你要通过一个实现类,将文本控件中输入的数字,做 加减乘除(也许还有很多运算) 法的运算,你发现这样会有一些问题存在,字符串如果不能转换成数字,就会报错。那么,你必须在方法的开头加入验证判断。但是,你又发现每个方法都要写验证是很麻烦的,而且代码量也会很多。于是你将验证抽取出来,成为一个方法。 每个运算方法都在开头调用这个验证就行了。这样是没有问题的。然而,如果这个实现类不是你写的,是A程序员写的,而A程序员觉得他无法知道,使用这个实现类的程序员是否希望验证这个字符串,所以,他把字符串的验证工作交给了调用的程序员。而你在使用这个实现类的时候,你不能修改这个实现类,给他的每个方法开头加入字符串的验证。那么怎么去让这个实现类的每个运算方法都在调用前都去验证一下呢?代理就可以动态的在每个方法前加入验证,比如add(int,int)方法,如果调用代理类的方法,代理类将先做验证,然后再去调用实现类的方法。这个是有必要的,因为代理的动态的加入验证代码,不需要每个方法钱都加入验证。最后总结一下,代理的作用大多是实现类的实现,对于调用者特定功能来说,做的还不够,这代理,可以加入那些还不够的代码,然后再去调用实现类。
java设计模式之代理模式:
很简单:对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。也就是说,我要修改真实角色的操作的时候,尽量不要修改他,而是在外部在“包”一层进行附加行为,即代理类。
例如:接口A有一个接口方法operator(),真是角色:RealA实现接口A,则必须实现接口方法operator()。客户端Client调用接口A的接口方法operator()。
现在新需求来了,需要修改RealA中的operator()的操作行为。怎么办呢?如果修改RealA就会影响原有系统的稳定性,还要重新测试。这是就需要代理类实现附加行为操作。创建代理ProxyA实现接口A,并将真实对象RealA注入进来。ProxyA实现接口方法operator(),可以增加附加行为,然后调用真实对象的operator()。从而达到了“对修改关闭,对扩展开放”,保证了系统的稳定性。我们看客户端Client调用仍是接口A的接口方法operator(),只不过实例变为了ProxyA类了而已。
建议看看《软件秘笈:设计模式那点事》,当中讲解的很详细,例子也很生动,读了收获很大!希望以上内容对你有帮助!
Java程序性能优化-代理模式(5)
代理模式( )
在以上代码中 使用CtField make()方法和CtNewMehod make()方法在运行时生成了代理类的字段和方法 这些逻辑由Javassist的CtClass对象处理 将Java代码转换为对应的字节码 并生成动态代理类的实例
注意 与静态代理相比 动态代理可以很大幅度地减少代码行数 并提升系统的灵活性
在Java中 动态代理类的生成主要涉及对ClassLoader的使用 这里以CGLIB为例 简要阐述动态类的加载过程 使用CGLIB生成动态代理 首先需要生成Enhancer类实例 并指定用于处理代理业务的回调类 在Enhancer create()方法中 会使用DefaultGeneratorStrategy Generate()方法生成动态代理类的字节码 并保存在byte数组中 接着使用ReflectUtils defineClass()方法 通过反射 调用ClassLoader defineClass()方法 将字节码装载到ClassLoader中 完成类的加载 最后使用ReflectUtils newInstance()方法 通过反射 生成动态类的实例 并返回该实例 无论使用何种方法生成动态代理 虽然实现细节不同 但主要逻辑都如图 所示
图 实现动态代理的基本步骤
前文介绍的几种动态代理的生成方法 性能有一定差异 为了能更好地测试它们的性能 去掉DBQuery类中的sleep()代码 并使用以下方法测试
public static final int CIRCLE= ;
public static void main(String[] args) throws Exception {
IDBQuery d=null;
long begin=System currentTimeMillis()
d=createJdkProxy() //测试JDK动态代理
System out println( createJdkProxy: +(System currentTimeMillis() beg in))
System out println( JdkProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJdkProxy: +(System currentTimeMillis() begin ))
begin=System currentTimeMillis()
d=createCglibProxy() //测试CGLIB动态代理
System out println( createCglibProxy: +(System currentTimeMillis() b egin))
System out println( CglibProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callCglibProxy: +(System currentTimeMillis() beg in))
begin=System currentTimeMillis()
d=createJavassistDynProxy() //测试Javaassist动态代理
System out println( createJavassistDynProxy: +(System currentTimeMil lis() begin))
System out println( JavassistDynProxy class: +d getClass() getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJavassistDynProxy: +(System currentTimeMilli s() begin))
begin=System currentTimeMillis()
d=createJavassistBytecodeDynamicProxy() //测试Javassist动态代理
System out println( createJavassistBytecodeDynamicProxy: +(System cu rrentTimeMillis() begin))
System out println( JavassistBytecodeDynamicProxy class: +d getClass()
getName())
begin=System currentTimeMillis()
for(int i= ;iCIRCLE;i++)
d request()
System out println( callJavassistBytecodeDynamicProxy: +(System curr entTimeMillis() begin))
}
返回目录 Java程序性能优化 让你的Java程序更快 更稳定
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
J ME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
lishixinzhi/Article/program/Java/gj/201311/27830
关于java代理模式性能和java实现网络代理的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。