1.代理模式定義
Provide a surrogate or placeholder for another object to control access to it. 對其他對象提供一種代理,以控制對這個對象的訪問
2.代理模式通用類圖
代理模式的通用類圖如下:
其中Subject為抽象主題角色:
Subject為普通業務接口
RealSubject為具體主題角色:
此類為具體被代理的對象
Proxy為代理類:
此類負責執行被代理的功能,並且在處理前后做預處理和善后操作
3.通用模式的代碼實現:
Subject類:
public interface Subject {
/**
* 發送request請求
*/
void request();
}
RealSubject類:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("Send request:" + "....");
}
}
Proxy代理類,在代理類中可以通過構造函數或setter方法傳入。
public class Proxy implements Subject {
private Subject subject;
public Proxy(Subject subject){
this.subject = subject;
}
@Override
public void request() {
subject.request();
}
private void before(){
// do before
}
private void after(){
//do after
}
}
4.動態代理
動態代理:是在實現階段不用關心代理誰,而在運行階段才指定代理哪一個對象。
其中Spring的AOP是典型的動態代理模式
下面我們以網絡連接中的代理為例說明動態代理,類圖如下:
首先定義一個網絡連接器:Connector,此方法中只定義了一個connect方法,用於創建網絡連接,代碼如下:
public interface Connector {
/**
* 建立網絡連接
*/
void connect();
}
然后定義Connector接口的實現類如下:
public class NetworkConnector implements Connector {
@Override
public void connect() {
System.out.println("Connect to network.");
}
}
此類為被代理的對象。
最后定義動態代理類,JDK中定義了用於動態代理的接口
InvocationHandler,實現動態代理的類必須實現此接口。
代碼如下:
public class NetworkConnectorDP implements InvocationHandler {
private Object realObject;
public NetworkConnectorDP(Object realObject){
this.realObject = realObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Exception{
return method.invoke(this.realObject, args);
}
}
最后定義Client帶使用動態代理功能,代碼如下:
public class Client {
public static void main(String[] args) throws Exception {
Connector connector = new NetworkConnector();
InvocationHandler handler = new NetworkConnectorDP(connector);
ClassLoader classLoader = connector.getClass().getClassLoader();
Connector proxy = (Connector) Proxy.newProxyInstance(classLoader, new Class[]{Connector.class}, handler);
System.out.println("Start connect to network.");
proxy.connect();
System.out.println("Connect to network finished.");
}
}