通过给其他对象提供一种代理,实现可以通过该代理控制对该对象的访问,代理模式在实现上又可以分为静态代理和动态代理两种类型,以下分别对这两种不同类型的代理进行讲解:
1、静态代理,往往会定义一个目标接口,然后目标对象与代理对象均实现该目标接口,并且代理对象依赖于真实的目标对象,通过真实的目标对象来完成实际的业务操作,但是代理对象能够在目标对象调用的前后做一定的处理操作,并且对返回值也能做一定的控制。
/**
*代理目标接口
*/
public interface Subject
{
public String doSomething(String something);
/**
*代理目标最终实现
*/
public class RealSubject implements Subject
{
/*
* (non-Javadoc)
*
* @see
* net.carefx.pattern.proxypattern.Subject#doSomething(java.lang.String)
*/
@Override
public String doSomething (String something)
{
System.out.println ("had did " + something);
return something;
}
/**
*静态代理对象,持有真实委托代理对象的引用
*/
public class StaticProxySubject implements Subject
{
private Subject subject;
public StaticProxySubject (Subject subject)
{
this.subject = subject;
}
/*
* (non-Javadoc)
*
* @see
* net.carefx.pattern.proxypattern.Subject#doSomething(java.lang.String)
*/
@Override
public String doSomething (String something)
{
System.out.println ("pre do other something....");
String value = subject.doSomething (something);
System.out.println ("post do other something....");
return value;
}
public static void main (String[] args)
{
Subject realSubject=new RealSubject ();
Subject proxy=new StaticProxySubject (realSubject);
System.out.println (proxy.doSomething ("hello world!!"));
}
2、动态代理,动态代理是相对于静态代理而言的,静态代理中为了代理一个委托对象完成其访问控制就必须为其新建立一个相应的代理类,而动态代理则巧妙的运用了jdk提供的反射机制,在运行时动态的为我们生成需要的代理类,只需要我们传入一个委托处理接口的实现即可。
/**
*代理对象最终的执行器,通过一个Object的对象能够实现对任意类型的java委托对象进行代理
*/
public class SubjectInvocationHandler implements InvocationHandler
{
//接收任意类型的代理目标
private Object subject;
public SubjectInvocationHandler (Object subject)
{
this.subject = subject;
}
/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable
{
System.out.println ("pre did other something");
Object value = method.invoke (subject, args);
System.out.println ("post did other something");
return value;
}
/**
*动态的为委托类生成代理对象
*/
public class DynamicProxyClient
{
public static void main (String[] args)
{
Subject realSubject=new RealSubject ();
Subject subject=(Subject)Proxy.newProxyInstance (Subject.class.getClassLoader (),new Class[]{Subject.class}, new SubjectInvocationHandler (realSubject));
System.out.println (subject.doSomething ("hello world"));
}