代理模式简单说就是当客户端需要调用某个对象时,实际上不关心是否准确得到该对象,它只要一个能提供改功能的对象就可以了。在这种模式下,系统会为某个对象提供一个代理对象,并有代理对象控制对源对象的控制。总之,只要客户端不能或不想直接访问被调用对象,如要创建一个开销很大的系统对象,调用远程主机上的对象,或目标对象不够强大等,都可以采用代理模式。
下面示范一个简单的代理模式,首先实现一个借口Subject
package impl;
public interface Subject {
public void proxy();
}
为这接口提供一个实现类
package impl;
public class RealSubject implements Subject {
public RealSubject(){
try{
Thread.sleep(6000);//程序暂停6秒模拟系统开销
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void proxy() {
// TODO Auto-generated method stub
System.out.println("this is RealSubject......");
}
}
代理类
package impl;
public class MyProxy implements Subject {
RealSubject rs;
public MyProxy(RealSubject rs){
this.rs=rs;
}
@Override
public void proxy() {
if(null == rs){
rs = new RealSubject();
}
rs.proxy();
}
}
客户端Client
package impl;
public class Client {
public static void main(String args[]){
long start = System.currentTimeMillis();
MyProxy proxy = new MyProxy(null);
// proxy.proxy();
System.out.println(System.currentTimeMillis()-start);
}
}
上面的就是一个简单的代理模式,初始化Subject非常快,因为程序并没有真正创建MySubject对象,只是等到了要调用MySubject的方法,如proxy()方法的时候才会创建。在某些情况下,系统可能永远都不会真正使用proxy方法,意味着系统不用创建MySubject对象,这就大大提高了系统的性能。
使用代理模式还能够增强已有对象的功能,通过java的Proxy和InvocationHandler就可以实现动态代理,并增强原有对象的功能。使用上面的Subject和MySubject,现在增加一个功能类TxUtil来模拟事务功能,实际上就是个拦截器类。
package impl;
public class TxUtil {
public void beginTx(){
System.out.println("模拟事务的开始.......");
}
public void endTx(){
System.out.println("模拟事务的结束.......");
}
}
创建MyInvokationHandler类,它是InvocationHandler实现类,该实现类的invoke方法将会作为代理对象的方法实现,也就是说,invoke()方法将作为动态代理对象所有方法的实现体。
package impl;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvokationHandler implements InvocationHandler {
//需要被代理的对象
private Object targer;
public void setTarget(Object o){
targer = o ;
}
//执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
TxUtil tx = new TxUtil();
tx.beginTx(); //1
Object result = method.invoke(targer, args); //2
tx.endTx(); //3
return result;
}
}
上面1行会调用模拟的开始事务方法,2行通过反射回调被代理对象的目标方法,3行调用模拟的结束事务方法,这样,就给原有方法增加了事务的功能。
下面实现一个MyProxyFactory类,专为指定的target生成动态代理实例
package impl;
import java.lang.reflect.Proxy;
public class MyProxyFactory {
//为指定targer生成动态代理对象
public static Object getProxy(Object target) throws Exception{
MyInvokationHandler handler = new MyInvokationHandler();
handler.setTarget(target);
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),handler);
}
}
该动态代理工厂类提供了一个getProxy()方法,该方法为target生成了一个动态代理对象,当调用动态代理对象的指定方法时,实际上变为执行MyInvokationHandler的invoke方法。当我们还要增强功能时,只要增加另外的拦截器类,并在invoke中调用即可。
下来实现个测试类
package impl;
public class Test {
public static void main(String args[]) throws Exception{
//创建一个原始的RealSubject对象,作为target
Subject target= new RealSubject();
//以指定的target来创建动态代理
Subject subject = (Subject)MyProxyFactory.getProxy(target);
subject.proxy();
}
}
运行结果:
模拟事务的开始.......
this is RealSubject......
模拟事务的结束.......
分享到:
相关推荐
Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
总结一下,Java代理模式的核心在于`Proxy`类和`InvocationHandler`接口,它们共同实现了在运行时动态创建符合特定接口的代理对象。通过代理,我们可以在不修改原始对象代码的情况下,添加额外的功能或者控制对原始...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,该代理对象在调用实际对象的方法之前或之后可以执行额外的操作。这在不修改原有对象代码的情况下,提供了扩展功能的可能性。代理模式通常分为两...
Java代理模式是一种设计模式,它允许我们为现有的对象创建一个代理对象,以便在不修改原对象的情况下增强或扩展其功能。这种模式在处理需要添加额外逻辑但又不想修改原始类的场景时尤其有用,比如日志、事务管理、...
### Java代理模式和动态代理详解 #### 一、概述 在软件工程中,代理模式是一种常用的软件设计模式,主要用于在不直接暴露目标对象的情况下提供一个替代接口。这种模式可以简化客户端与目标对象之间的交互,同时还...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在不影响原始对象功能的基础上,增强或扩展其行为。代理模式在软件开发中广泛应用,例如用于权限控制、事务管理、日志记录等场景。...
在给定的“java代理模式示例源码”中,我们可以通过房产中介的例子来理解这种模式。 房产中介在现实生活中,是客户与房东之间的桥梁,它可以代表客户处理租赁事宜,也可以在房东和客户之间传递信息,这与代理模式的...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在调用原始对象的方法之前或之后执行额外的操作。代理模式在软件工程中有多种应用,例如:增加安全控制、性能监控、事务管理等。...
Java代理模式 事例很生动,非常容易理解,推荐给大家。
在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的...
用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明
Java代理模式.pdf