前言:
來源於《head first 設計模式》。當作讀書筆記了,這次看的是第11章狀態模式。這是最後一篇關於這本書的博客了。從2020-4-7開始寫的第一篇策略模式一直到現在,唏噓,終於還是來到了這裏。
代理模式(的概念
允許對象在內部狀態改變時改變它的行爲,對象看起來好想改變了它的類
靜態代理模式的uml圖
此圖來源於其他博客
代理比較簡單,其實就是委託給真正的對象來執行。靜態代理也是比較簡單的一種實現,這裏不展開了。
動態代理模式的uml圖
利用反射機制在運行時創建代理類。
接口、被代理類不變,我們構建一個handler類來實現InvocationHandler接口。
接口及其實現類
public interface HelloInterface {
void sayHello();
}
public class Hello implements HelloInterface{
@Override
public void sayHello() {
System.out.println("Hello lqhao!");
}
}
構建一個handler類來實現InvocationHandler接口,這部分負責程序的增強部分
public class ProxyHandler implements InvocationHandler{
private Object object;
public ProxyHandler(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before invoke " + method.getName());
method.invoke(object, args);
System.out.println("After invoke " + method.getName());
return null;
}
}
執行動態代理:
public class ProxyTest {
public static void main(String[] args) {
HelloInterface hello = new Hello();
InvocationHandler handler = new ProxyHandler(hello);
HelloInterface proxyHello = (HelloInterface) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), handler);
proxyHello.sayHello();
}
}
通過Proxy類的靜態方法newProxyInstance返回一個接口的代理實例。針對不同的代理類,傳入相應的代理程序控制器InvocationHandler即可。
總結:
動態代理的實現過程
1.通過實現 InvocationHandler 接口創建自己的調用處理器;
2.通過爲 Proxy 類指定 ClassLoader 對象和一組 interface 來創建動態代理類;
3.通過反射機制獲得動態代理類的構造函數,其唯一參數類型是調用處理器接口類型;
4.通過構造函數創建動態代理類實例,構造時調用處理器對象作爲參數被傳入。