代理模式大家應該都非常熟悉了吧,我們的spring中到處使用了代理,比如我們用聲明式事物,寫一個事物註解,當我們在調用目標對象的某個方法前,spring會先爲我們開啓一個事物,方法調用結束,spring會爲我們提交事物...看起來我們好像是直接使用了目標對象調用了目標方法,而實際上卻是使用的spring爲我們創建的代理對象...關於這個話題這裏不做展開,後續我會寫數篇關於spring整個框架原理的解析博文 , 現在,我們舉一個簡單的例子,來展示下代理模式是怎麼工作的!
假設現在你要送給某領導一份禮物,而你與該領導還沒有熟悉到送禮物的程度,此時,你可能想要拜託領導的某熟人,讓其代替你送禮物...
上面的例子就是一個典型的代理模式, 領導的熟人代替你去給領導送禮物,而他送的禮物的來源實際上還是要藉助於你提供禮物...現在我們用代理模式的類結構來組織下代碼!
/**送禮物的接口*/
interface SendGift{
//定義送禮物的方法
void send();
}
/**你,目標對象*/
class Clerk implements SendGift{
@Override
public void send() {
System.out.println("送給領導一壺茶");
}
}
/**領導熟人,代理對象*/
class ClerkProxy implements SendGift{
//保存目標對象的引用
private SendGift target;
public ClerkProxy( SendGift target) {
this.target = target;
}
@Override
public void send() {
System.out.println("送禮物前,我先聯繫好領導");
target.send();
System.out.println("送完禮物後,與領導客套幾句並說明這是你送的...");
}
}
public static void main(String[] args) {
SendGift target = new Clerk();
SendGift proxy = new ClerkProxy(target);
proxy.send();
}
輸出**************************************************
送禮物前,我先聯繫好領導
送給領導一壺茶
送完禮物後,與領導客套幾句並說明這是你送的...
*******************************************************
Ok,我們看到,代理模式其實很簡單,首先由於客戶端並不知道自己是在和代理對象打交道,所以代理對象與目標對象必須實現同樣的接口,而在代理對象中必須持有目標對象的引用,因爲代理對象調用的方法實際上是需要目標(被代理)對象類來提供的, 而代理對象有什麼用呢? 就如代碼中所示,它在調用目標方法的前後可以加入自己的邏輯處理,這樣的邏輯處理就相當於上面提到的事物的開啓與提交..
我們畫個圖來看看代理模式的類結構:
在上面的代碼中,Subject就相當於SendGift接口,而Clerk相當於target對象,至於ClerkProxy肯定就相當於proxy對象了;
好了,不多說,設計模式系列的文章到這裏也該結束了,值得一提的是,上面的做法是靜態代理的實現,而JDK爲我們提供了動態代理的實現,關於兩者區別以及原理這裏就不再多說了,動態代理也非常簡單,藉助於java.lang.reflect.Proxy的newProxyInstance()便能夠實現,這裏不再多說,大家可以在網上隨意搜索便有一大堆的實例!