第十九篇:代理模式

代理模式大家應該都非常熟悉了吧,我們的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()便能夠實現,這裏不再多說,大家可以在網上隨意搜索便有一大堆的實例!



發佈了48 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章