java中的代理模式,使用Proxy实现的一个动态的代理模式

<p>代理模式是我们在java的练习的时候常见的一种设计模式,代理模式的分类,个人的总结是可以分为静态的代理和动态的代理模式,其中静态的代理模式和动态的代理模式我们可以理解为html和jsp的区别。使用动态的代理的模式的时候,我们可以借助于java的API提供的Proxy进行基本的操作,</p> <h1>代理模式个人浅谈:</h1> <p>代理模式是我们在java中常见的一种设计模式,我们不妨拿到我们现实的生活中去理解这样一个重要的设计模式:租房子。假设一下我们自己的情形,我们就是一个租房子的用户我们关心的就是只要有房子可以租住就可以,价钱上好说,但是我们自己找房子却不是那么的容易。可是呢,有一些比较富有的贵族,房子空闲着,于是拿出来想租出去,可是这些贵族是懒得去找客户,而却找到一个客户也是一件不容易的事情,于是我们看见了街头上好多的小的广告--中介,这是我们生活中最最典型的一种代理的设计模式。我们需要数据(房子),存有数据的用户(真正的房东),需要借助于服务方(中介)把自己的房子租出去,当然这么一层的设计在我们的代码中是多少的有一些复杂,也使得我们的代码量增加了,但是在java的开发中引用这样的操作,可以使得我们的代码看上去健壮性更好,后期的维护也好,而且我们可以设计到单例的时候,把我们的服务器的内存的利用降低带最低,如此以来是一个非常好的出路。一种看上去繁琐的操作,在客户和真正的服务端添加的这么一些代码,使得我们自己的逻辑处理更加的细化,我们可以从中的进行权限的操作,等等……</p> <p>下面的一个实例就是一个实现基本操作数据库的一个缩影:</p> <h1>创建一个java项目,其中创建如下的几个类:</h1> <h2>接口:userDao</h2> <p>package com.fww.dao;</p> <p>public interface UserDao { <br />&#160;&#160;&#160; void add(); <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; void del(); <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; int he(); <br />} <br /></p> <h2>实现接口的一个类 userDaoimpl</h2> <p>package com.fww.dao.impl;</p> <p>import com.fww.dao.UserDao;</p> <p>public class UserDaoImpl implements UserDao{</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public void add() { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;执行userdao&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public void del() { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;执行的是del&quot;); <br />&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public int he() { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 3; <br />&#160;&#160;&#160; }</p> <p>} <br /></p> <h2>一个生产userDao的工厂:userDaoFact</h2> <p>package com.fww.fact;</p> <p>import java.lang.reflect.Proxy;</p> <p>import com.fww.dao.UserDao; <br />import com.fww.dao.impl.UserDaoImpl; <br />import com.fww.handler.LogHandler;</p> <p>public class UserDaoFact { <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; public static UserDao getInstance(){ <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; UserDao userDao = (UserDao) Proxy.newProxyInstance( <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; UserDao.class.getClassLoader(), <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; UserDaoImpl.class.getInterfaces(), <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new LogHandler(new UserDaoImpl())); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return userDao; <br />&#160;&#160;&#160; } <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; public static void main(String[] args) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; UserDao dao = UserDaoFact.getInstance(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; dao.add(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(dao.he()); <br />&#160;&#160;&#160; } <br />} <br /></p> <p>&#160;</p> <h2>一个使用到java中的Proxy的类,也就是我们代码的核心的一部分:LogHandler</h2> <p>package com.fww.handler;</p> <p>import java.lang.reflect.InvocationHandler; <br />import java.lang.reflect.Method;</p> <p>public class LogHandler implements InvocationHandler{ <br />&#160;&#160;&#160; private Object obj;</p> <p>&#160;&#160;&#160; public LogHandler(Object object) { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; super(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.obj = object; <br />&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160; @Override <br />&#160;&#160;&#160; public Object invoke(Object proxy, Method method, Object[] args) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; throws Throwable { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO Auto-generated method stub <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; String methodName = method.getName(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;dao的方法执行之前的操作&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object result = method.invoke(obj,args); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;dao方法的执行之后的操作&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return result; <br />&#160;&#160;&#160; } <br />&#160;&#160;&#160; <br />&#160;&#160;&#160; <br />} <br />下面进行的是基本的代码的解析:</p> <p>使用java的代理模式的时候,我们可以发现,java自带的这一种实现代理模式的类,需要有一个共同的接口,实现一种幻觉,就好像是我们自己去租房子的时候,我们需要的只是一座房子,我们</p> <p>1、代码的关键的地方实在我们的dao工厂类中,其中涉及到一些java中的Proxy的函数的操作,</p> <p>(UserDao) Proxy.newProxyInstance( <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; UserDao.class.getClassLoader(), <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; UserDaoImpl.class.getInterfaces(), <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new LogHandler(new UserDaoImpl())); <br />其中的第一个是一个类的加载,给底层的一个操作的模式,第二个参数,相当于我们给他指明的接口的类型,其中第三个参数,是我们使用到的代理类,也就是下面我们建立的java类。</p> <p>2、我们自己建立的代理类的时候是需要进行java中代理类的一个接口的继承的,实现其中的</p> Object invoke(Object proxy, Method method, Object[] args) <br /> <p>方法,其中还是会设计到java的反射的机制的。</p>

转载于:https://my.oschina.net/fuweiwei/blog/171134

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值