JAVA設計模式之 代理模式【Proxy Pattern】

小呂-ICE發表於2015-01-10

一、概述

    給某一個物件提供一個代理,並由代理物件來完成對原物件的訪問。代理模式是一種物件結構型模式


二、適用場景

    當無法直接訪問某個物件或訪問某個物件存在困難時可以通過一個代理物件來間接訪問,為了保證客戶端使用的透明性,委託物件與代理物件需要實現相同的介面。


三、UML類圖

         

四、參與者

     1、介面類:Subject

          它宣告瞭真實訪問者和代理訪問者的共同介面,客戶端通常需要針對介面角色進行程式設計。

     2、代理類:ProxySubject

          包含了對真實(委託)物件(RealSubject)的引用,在實現的介面方法中呼叫引用物件的介面方法執行,從而達到代理的作用。看似是代理物件(ProxySubject)在操作,但其實真正的操作者是委託物件(RealSubject)。

    3、委託類/真實訪問類:RealSubject

         它定義了代理角色所代表的真實物件,在真實角色中實現了真實的業務操作,客戶端可以通過代理角色間接呼叫真實角色中定義的操作。


五、用例學習

    1、介面類:Subject.java

/**
 * 介面類
 * @author lvzb.software@qq.com
 *
 */
public interface Subject {

	public void visit();
}
    2、介面實現類,真實訪問物件/委託物件:RealSubject.java

/**
 * 介面實現類,真實訪問物件/委託物件
 * @author lvzb.software@qq.com
 *
 */
public class RealSubject implements Subject {

	@Override
	public void visit() {
		System.out.println("I am 'RealSubject',I am the execution method");
	}
	
}
    3、介面實現類,代理物件:ProxySubject.java

/**
 * 介面實現類,代理物件
 * @author lvzb.software@qq.com
 *
 */
public class ProxySubject implements Subject {
	// 維持對真實委託物件的引用,該物件才是真正的執行者
	private Subject realSubject;
	
	public ProxySubject(Subject subject){
		this.realSubject = subject;
	}

	@Override
	public void visit() {
		// 真實委託物件 通過 代理物件的引用 間接的實現了對目標物件的訪問執行
		realSubject.visit();
	}
}
    4、客戶類 Client.java

/**
 * 客戶類
 * @author  lvzb.software@qq.com
 *
 */
public class Client {

	public static void main(String[] args) {
		Subject proxySubject = new ProxySubject(new RealSubject());
		proxySubject.visit();
	}

}

六、其他/擴充套件

    按照代理類的建立時期,代理類可以分為兩種:

    1、靜態代理:由程式設計師建立或特定工具自動生成原始碼,再對其編譯。在程式執行前,代理類的.class檔案就已經存在了。(上面用例介紹的就是 靜態代理技術)

 

    靜態代理的優劣分析:

    優點:客戶端面向介面程式設計,符合開閉原則,使系統具有好的靈活性和擴充套件性。

    缺點:從上面程式碼中我們可以發現 每一種代理類都是實現了特定的介面,及每一種代理類只能為特定介面下的實現類做代理。如果是不同介面下的其他實現類,則需要重新定義新介面下的代理類。     

 

    那麼是否可以通過一個代理類完成不同介面下實現類的代理操作呢?那麼此時就必須使用動態代理來完成。


    2、動態代理:在程式執行時,運用JAVA反射機制動態建立代理例項。

        【預告:關於動態代理技術  小呂將會在下一篇中詳細介紹】



—————————————————————————————————————

如果文章內容對您有幫助, 不要忘記 頂 一下,來支援一下哦!   

如果您對文章內容有任何疑問或有更好的見解, 可以通過評論留言或發郵件的方式聯絡我: 

ice_zhengbin@163.com  /  ice.zhengbin@gmail.com


如果需要轉載,請註明出處,謝謝!!

—————————————————————————————————————


相關文章