//靜態代理模式
//其實這個可以是個接口,房地產開發商
public abstract class Subject
{
public abstract void request();
}
//購房的房主,真實對象
public class RealSubject extends Subject
{
public void request()
{
System.out.println("From real subject.");
}
}
//代理對象,中介
public class ProxySubject extends Subject
{
private RealSubject realSubject; //代理角色內部引用了真實角色
public void request()
{
this.preRequest(); //在真實角色操作之前所附加的操作
if(null == realSubject)
{
realSubject = new RealSubject();
}
realSubject.request(); //真實角色所完成的事情
this.postRequest(); //在真實角色操作之後所附加的操作
}
private void preRequest()
{
System.out.println("pre request");
}
private void postRequest()
{
System.out.println("post request");
}
}
//客戶端使用
public class Client
{
public static void main(String[] args)
{
Subject subject = new ProxySubject();
subject.request();
}
}
輸出結果:
pre request
From real subject
post request
//動態代理模式
//這裏必須是接口,因爲在代理對象中實例化參數是接口數組
public interface Subject
{
public void request();
}
//真實對象,購房者
public class RealSubject implements Subject
{
public void request()
{
System.out.println("From real subject!");
}
}
/**
* 該代理類的內部屬性是Object類型,實際使用的時候通過該類的構造方法傳遞進來一個對象
* 此外,該類還實現了invoke方法,該方法中的method.invoke其實就是調用被代理對象的將要
* 執行的方法,方法參數是sub,表示該方法從屬於sub,通過動態代理類,我們可以在執行真實對象的方法前後
* 加入自己的一些額外方法。
*
*/
//動態代理
public class DynamicSubject implements InvocationHandler
{
private Object sub;
public DynamicSubject(Object obj)
{
this.sub = obj;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
System.out.println("before calling: " + method);
method.invoke(sub, args);//其實這個method就是class對象下的request()方法,調用了真實對象下的request()方法,參數new Object[]{}是null空的。
System.out.println(args == null);
System.out.println("after calling: " + method);
return null;
}
}
//客戶端
public class Client
{
public static void main(String[] args)
{
RealSubject realSubject = new RealSubject();
InvocationHandler handler = new DynamicSubject(realSubject);
Class<?> classType = handler.getClass();
// 下面的代碼一次性生成代理
Subject subject = (Subject) Proxy.newProxyInstance(realSubject
.getClassLoader(), realSubject.getClass().getInterfaces(),
handler);//實例化一個代理出來,每一個代理實例都會有一個相應的handler處理裏面的invoke方法
subject.request();//這個subject的實例是$Proxy0代理
System.out.println(subject.getClass());
}
另外一種動態代理的表示形式:
public class VectorProxy implements InvocationHandler
{
private Object proxyObj;
public VectorProxy(Object obj)
{
this.proxyObj = obj;
}
public static Object factory(Object obj)
{
Class<?> classType = obj.getClass();
return Proxy.newProxyInstance(classType.getClassLoader(),
classType.getInterfaces(), new VectorProxy(obj));
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
System.out.println("before calling: " + method);
if(null != args)
{
for(Object obj : args)
{
System.out.println(obj);
}
}
Object object = method.invoke(proxyObj, args);
System.out.println("after calling: " + method);
return object;
}
public static void main(String[] args)
{
List v = (List)factory(new Vector());
System.out.println(v.getClass().getName());
v.add("New");
v.add("York");
System.out.println(v);
v.remove(0);
System.out.println(v);
}