java代理模式原理详解

java代理模式原理详解

ID:6724039

大小:87.50 KB

页数:20页

时间:2018-01-23

java代理模式原理详解_第1页
java代理模式原理详解_第2页
java代理模式原理详解_第3页
java代理模式原理详解_第4页
java代理模式原理详解_第5页
资源描述:

《java代理模式原理详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、LZ不希望写的东西与网络上的资料千篇一律,所以这一系列不会像很多典型文章一章,只是列出这个模式的定义以及一堆适用的情况,然后就是一堆这个模式的各个角色,对于这种罗列LZ并不反对,相比之下会比较清晰,但是如果脱离了实际,就会导致看的人特别是初学者觉得设计模式很陌生很遥远。LZ并不反对这种教学式的标准模式,但说实话,LZ本人看这种帖子从来都感觉收获不大,看一遍看一遍,到现在都没记住那些各个适用的情况与一堆乱七八糟的角色。所以LZ探讨代理模式,不会再按这个步骤进行,而是跟着自己的思维进行。首先代理模式,可以分为两种,一种是静态代理,一种是动态代理。两种代理从虚拟机加载类的角度来讲,本质上都是一样的,

2、都是在原有类的行为基础上,加入一些多出的行为,甚至完全替换原有的行为。静态代理采用的方式就是我们手动的将这些行为换进去,然后让编译器帮我们编译,同时也就将字节码在原有类的基础上加入一些其他的东西或者替换原有的东西,产生一个新的与原有类接口相同却行为不同的类型。说归说,我们来真实的去试验一下,实验的话需要找一个示例,就拿我们的数据库连接来做例子吧。我们都知道,数据库连接是很珍贵的资源,频繁的开关数据库连接是非常浪费服务器的CPU资源以及内存的,所以我们一般都是使用数据库连接池来解决这一问题,即创造一堆等待被使用的连接,等到用的时候就从池里取一个,不用了再放回去,数据库连接在整个应用启动期间,几乎

3、是不关闭的,除非是超过了最大闲置时间。但是在程序员编写程序的时候,会经常使用connection.close()这样的方法,去关闭数据库连接,而且这样做是对的,所以你并不能告诉程序员们说,你们使用连接都不要关了,去调用一个其他的类似归还给连接池的方法吧。这是不符合程序员的编程思维的,也很勉强,而且具有风险性,因为程序员会忘的。解决这一问题的办法就是使用代理模式,因为代理模式可以替代原有类的行为,所以我们要做的就是替换掉connection的close行为。下面是connection接口原有的样子,我去掉了很多方法,因为都类似,全贴上来占地方。importjava.sql.SQLExceptio

4、n;importjava.sql.Statement;importjava.sql.Wrapper;publicinterfaceConnectionextendsWrapper{StatementcreateStatement()throwsSQLException;voidclose()throwsSQLException;}这里只贴了两个方法,但是我们代理的精髓只要两个方法就能掌握,下面使用静态代理,采用静态代理我们通常会使用组合的方式,为了保持对程序猿是透明的,我们实现Connection这个接口。如下所示缪买网www.miumai.comimportjava.sql.SQLExcep

5、tion;importjava.sql.Statement;publicclassConnectionProxyimplementsConnection{privateConnectionconnection;publicConnectionProxy(Connectionconnection){super();this.connection=connection;}publicStatementcreateStatement()throwsSQLException{returnconnection.createStatement();}publicvoidclose()throwsSQLEx

6、ception{System.out.println("不真正关闭连接,归还给连接池");}}我们在构造方法中让调用者强行传入一个原有的连接,接下来我们将我们不关心的方法,交给真正的Connection接口去处理,就像createStatement方法一样,而我们将真正关心的close方法用我们自己希望的方式去进行。此处为了更形象,LZ给出一个本人写的非常简单的连接池,意图在于表明实现的思路。下面我们来看一下连接池的变化,在里面注明了变化点。importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLExce

7、ption;importjava.util.LinkedList;publicclassDataSource{privatestaticLinkedListconnectionList=newLinkedList();static{try{Class.forName("com.mysql.jdbc.Driver");}catch(ClassNotFo

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。