本文參考自:http://www.cnblogs.com/qifengshi/p/6566752.html
1. 作用
代理模式是Java常見(jiàn)的設(shè)計(jì)模式之一。所謂代理模式是指客戶端并不直接調(diào)用實(shí)際的對(duì)象,而是通過(guò)調(diào)用代理,來(lái)間接的調(diào)用實(shí)際的對(duì)象。
為什么要采用這種間接的形式來(lái)調(diào)用對(duì)象呢?一般是因?yàn)榭蛻舳瞬幌胫苯釉L問(wèn)實(shí)際的對(duì)象,或者訪問(wèn)實(shí)際的對(duì)象存在困難,因此通過(guò)一個(gè)代理對(duì)象來(lái)完成間接的訪問(wèn)。
2. 結(jié)構(gòu)

代理模式中的角色
-
統(tǒng)一的抽象類Subject
上層統(tǒng)一的接口或抽象類 -
實(shí)際的實(shí)現(xiàn)類RealSubject
具體的實(shí)現(xiàn)類 -
RealSubject的代理類ProxySubject
具體實(shí)現(xiàn)類的代理類
3. 實(shí)現(xiàn)
代理模式有兩種實(shí)現(xiàn)方法,靜態(tài)代理和動(dòng)態(tài)代理。
靜態(tài)代理
Subject類
public interface Subject {
void visit();
}
RealSubject類
public class RealSubject implements Subject{
@Override
public void visit() {
System.out.println("this is real subject");
}
}
代理類
public class ProxySubject implements Subject{
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void visit() {
realSubject.visit();
}
}
客戶端類
public class StaticProxyPatternMain {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.visit();
}
}
動(dòng)態(tài)代理
動(dòng)態(tài)代理在代理類的構(gòu)建和代理類對(duì)象創(chuàng)建的過(guò)程中與靜態(tài)代理不同,具體如下。
Subject類
public interface Subject {
void visit();
}
RealSubject類
public class RealSubject implements Subject{
@Override
public void visit() {
System.out.println("this is real subject");
}
}
代理類
代理類需要實(shí)現(xiàn)InnovationHandler接口,并實(shí)現(xiàn)invoke方法,構(gòu)造函數(shù)中傳入的對(duì)象就對(duì)應(yīng)著具體實(shí)現(xiàn)類(RealSubject)的對(duì)象
public class ProxySubject implements InvocationHandler{
private Object object;
public ProxySubject(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object, args);
return result;
}
}
客戶端類
三個(gè)參數(shù)的含義
ClassLoader loader表示當(dāng)前使用到的appClassloader。
Class<?>[] interfaces表示目標(biāo)對(duì)象實(shí)現(xiàn)的一組接口。
InvocationHandler h表示當(dāng)前的InvocationHandler實(shí)現(xiàn)實(shí)例對(duì)象。
public class DynamicProxyPatternMain {
public static void main(String[] args) {
//創(chuàng)建RealSubject
RealSubject realSubject = new RealSubject();
//創(chuàng)建代理類,傳入RealSubject對(duì)象
ProxySubject proxySubject = new ProxySubject(realSubject);
//獲取實(shí)現(xiàn)對(duì)象的ClassLoader
ClassLoader classLoader = realSubject.getClass().getClassLoader();
/**
* 用Proxy.newProxyInstance創(chuàng)建代理類對(duì)象
* 三個(gè)參數(shù)對(duì)應(yīng)的是
* 具體實(shí)現(xiàn)類的ClassLoader
* 一個(gè)Class數(shù)組,數(shù)組中傳入抽象類的class對(duì)象
* ProxySubject對(duì)象
*/
Subject subject =(Subject) Proxy.newProxyInstance(classLoader, new Class[] {Subject.class}, proxySubject);
subject.visit();
}
}