新年好啊,講代理模式前,先講個簡單有趣的軟件應用——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平臺,這個就抱歉了,我就不分享了。
總結
上兩種的不同點是
- 靜態代理是通過在代碼中顯式定義一個業務實現類一個代理,在代理類中對同名的業務方法進行包裝.用戶通過代理類調用包裝過的業務方法。
- jdk動態代理是通過接口中的方法名,在動態生成的代理類中調用業務實現類的同名方法。