Java之靜態代理設計
阿新 • • 發佈:2022-03-06
簡介:
代理模式的設計是想要通過一個專門的操作類為一個業務介面服務。
標準代理類程式碼實現:
interface IMessage{ // 傳統代理設計一定要有介面
public void send();
}
class MessageReal implements IMessage{
@Override
public void send() {
System.out.println("【傳送一個訊息】");
}
}
class MessageProxy implements IMessage{ // 代理類
private IMessage message; // 代理物件,一定是業務介面例項
public MessageProxy(IMessage message) {
this.message = message;
}
public boolean connect(){
System.out.println("【訊息代理處理】進行訊息傳送通道的連線");
return true;
}
public boolean close(){
System.out.println("【訊息代理處理】進行訊息傳送通道的關閉");
return false;
}
@Override
public void send() {
if (this.connect()){ // 如果連線成功
this.message.send(); // 開始傳送訊息
this.close(); // 傳送後關閉
}
}
}
public class MAIN {
public static void main(String[] args) {
IMessage msg = new MessageProxy(new MessageReal());
msg.send();
}
}
輸出結果:
以上就是標準代理類的程式實現,但是可以發現在主類中需要獲取每一個類和介面的資訊才能實現代理類的功能,所以這裡最好還是建立一個工廠類進行 物件的獲取;
以上是靜態代理類的設計,此操作的特點就是:一個代理類為一個介面服務,那麼如果現在準備了幾千個業務介面,就需要幾千個介面,這樣合理嗎?顯然是不合理的,那麼就需要進一步進行優化。
動態代理類:
可以發現上面的操作存在大量的重複操作,所以可以進行動態獲取資訊進行代理類的建立以實現同一的代理操作:
-不論是動態還是靜態的代理類都必須要實現真實業務子類的接收;
- 由於動態代理類不再與某一個介面進行捆綁,應該可以動態獲取類的介面資訊;
動態代理類的建立要藉助於系統類的一個介面:
public interface InvocationHandler;
這個介面中只有一個方法:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
這個方法在前面的反射經常有見到過。
在進行動態代理設計的時候對於物件的建立都是由JVM底層完成的,此時主要依靠的是java.lang.reflect.Proxy程式類 ,而這個程式類之中只提供有一個核心方法:
代理物件:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
|-ClassLoader loader:獲取當前真實主體類的ClassLoader;
|-Class<?>[] interfaces:代理都是圍繞介面進行的,所以一定要獲取真實主體類的介面資訊;
|-InvocationHandler h:代理處理的方法。
由invoke()去呼叫業務介面的fun()方法;
未完待續。。。