遲來的學習記錄——代理模式

新年好啊,講代理模式前,先講個簡單有趣的軟件應用——Android快應用

如下圖,應用市場搜索快應用,目前瞭解的只支持各大廠商的應用市場中打開。
在這裏插入圖片描述
打開之後我們可以看到很多App應用。
在這裏插入圖片描述

這些App應用都是可以無需安裝打開即用的,網頁加載比小程序快超多的。

對比圖我借來了,很多生活軟件是無需安裝的,手機內存不足的可以用用Android快應用哦。
在這裏插入圖片描述
好了講代理模式了

java代理模式——靜態代理

先模擬個故事,比如我現在在杭州但是想買點家鄉的特產,這個時候我是回不去了,但是有個同事要回家一趟還是我老鄉,這個時候我是不是可以叫他幫我帶一下。ok。
我們給老鄉他取個名字叫老王。
下面開始代碼。
我們的行爲是不是買特產,這個行爲我們叫購買。

1.創建Shop接口
public interface Shop {
    void buy();//購買的方法
}
2.創建ShiYuTian類
public class ShiYuTian implements Shop {
    @Override
    public void buy() {
        System.out.println("購買了****");//爲啥是****,這個男人嗎你懂得,你們想歪別怪我
    }
}
3.創建LaoWang類
public class LaoWang implements Shop{
    private Shop shop;
    public LaoWang(Shop shop){
        this.shop=shop;
    }
    @Override
    public void buy() {
        shop.buy();
    }
}
4.客戶端買特產了
public class Client {
    public static void main(String[] args) {
        Shop shiyutian=new ShiYuTian();
        Shop laowang=new LaoWang(shiyutian);//老王去幫我買,嘻嘻
        laowang.buy();
    }
}
5.結果

在這裏插入圖片描述
東西是不是到手了,嘻嘻,靜態代理模式就是這樣。

java代理模式——動態代理

注意拉,老王現在不在了,但是我是個死都胖不了的瘦子,必須要吃家鄉特產,怎麼辦,我直接百度購買****,網上購物不香嗎?,這個是我不知道是誰啊幫買家鄉特產的情況,我們叫動態代理。
上代碼。

1.創建Shop接口
public interface Shop {
    void buy();//購買的方法
}
2.創建ShiYuTian類
public class ShiYuTian implements Shop {
    @Override
    public void buy() {
    }
}
3.創建Stranger類,這個網上購物我們叫陌生人購物,注意這不是對象
public class Stranger implements InvocationHandler{
    private Object object;
    public Stranger(Object object){
        this.object=object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result=method.invoke(object,args);
        if(method.getName().equals("buy")){
            System.out.println("ShiYuTian在買****");
        }
        return null;
    }
}
4.創建Client 實現動態代理購物
/*
 * newProxyInstance方法的三參數
 * ClassLoader loader:指定當前目標對象使用類加載器,獲取加載器的方法是固定的
 * Class<?>[] interfaces:目標對象實現的接口的類型,使用泛型方式確認類型
 * InvocationHandler h:事件處理,執行目標對象的方法時,會觸發事件處理器的方法,會把當前執行目標對象的方法作爲參數傳入
 */
public class Client {
    public static void main(String[] args) {
          Shop shiyutian=new ShiYuTian();//創建對象
          Stranger stranger=new Stranger(shiyutian);
          ClassLoader loader=shiyutian.getClass().getClassLoader();
          Shop shop= (Shop) Proxy.newProxyInstance(loader,new Class[]{Shop.class},stranger);
          shop.buy();//動態代理是在運行時創建對象,然後去購物,靜態代理是直接老王去買了
    }
}

java代理模式——子類代理cglib

類似cglib框架 在Android中是MethodInterceptProxy框架 ,Android當中是不能使用cglib的,cglib不支持Android平臺,這個就抱歉了,我就不分享了。

總結

上兩種的不同點是

  1. 靜態代理是通過在代碼中顯式定義一個業務實現類一個代理,在代理類中對同名的業務方法進行包裝.用戶通過代理類調用包裝過的業務方法。
    在這裏插入圖片描述
  2. jdk動態代理是通過接口中的方法名,在動態生成的代理類中調用業務實現類的同名方法。
    在這裏插入圖片描述
記錄的同時,希望能夠幫到你,下次見
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章