Head First 設計模式之代理模式(Java例子)

前言:

來源於《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.通過構造函數創建動態代理類實例,構造時調用處理器對象作爲參數被傳入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章