Java設計模式:代理模式

pan_jinquan發表於2016-07-24

Java設計模式:代理模式

    【尊重原創,轉載請註明出處】http://blog.csdn.net/guyuealian/article/details/52015707
     使用代理模式建立代理物件,讓代理物件控制目標物件的訪問(目標物件可以是遠端的物件、建立開銷大的物件或需要安全控制的物件),且可以在不改變目標物件的情況下新增一些額外的功能。代理模式給某一個物件提供一個代理物件,並由代理物件控制對原物件的引用,完成各種操作,並可以擴充套件功能。簡而言之,可以通過代理完成真實的意圖操作,並可以擴充套件業務功能
    Subject:抽象主題角色,抽象主題類可以是抽象類,也可以是介面,是一個最普通的業務型別定義,無特殊要求。
    RealSubject:具體主題角色,也叫被委託角色、被代理角色。是業務邏輯的具體執行者。
    Proxy:代理主題角色,也叫委託類、代理類。它把所有抽象主題類定義的方法給具體主題角色實現,並且在具體主題角色處理完畢前後做預處理和善後工作。代理物件角色內部含有對真實物件的引用,從而可以操作真實物件,同時代理物件提供與真實物件相同的介面以便在任何時刻都能代替真實物件。同時,代理物件可以在執行真實物件操作時,附加其他的操作,相當於對真實物件進行封裝。 

     就比如,我想找一份百度的工作,就有兩種方式選擇,(1)不用人幫忙,我自己瞎找(2)另外一種就是通過別人代理方式找,比如通過在百度工作的師兄師姐內推的方式,這種情況,只需要傳遞一個找工作的物件,告知師兄師姐代理就可以,師兄師姐幫你找到想要的工作,還可以推薦其他相關的工作給你,這就擴充套件原來的功能啦。
(1)介面:定義主題主要功能
/**
 * 介面:定義主題主要功能
 */
public interface Object {
	public abstract void operation();
}
(2)具體主題,真實的具體操作,但該操作不在客戶端直接呼叫
/**
 * 具體主題,真實的具體操作,但該操作不在客戶端直接呼叫
 */
public class RealObject implements Object {
	@Override
	public void operation() {
		System.out.println("在RealObject類中,真實的具體操作");
	}
}
(3)代理類,代理真實的操作
/**
 * 代理類,代理真實的操作
 */
public class ProxyObject implements Object {
	private Object obj;

	public ProxyObject(Object obj) {
		this.obj = obj;// 設定代理的子類,即需要代理的真實物件
	}
	@Override
	public void operation() {
		// 呼叫目標物件之前可以做相關操作
		System.out.println("在ProxyObject代理類中,呼叫目標物件之前可做相關的業務操作");
		obj.operation();
		// 呼叫目標物件之後可以做相關操作
		System.out.println("在ProxyObject代理類中,呼叫目標物件之後還可做相關的業務操作");
	}
}
(4)客戶端程式
//客戶端
public class Client {

	public static void main(String[] args) {
		System.out.println("---------不使用代理-------------");
		Object obj;// 定義介面物件
		obj = new RealObject();// 例項化真實的物件
		obj.operation();// 直接使用真實類操作
		System.out.println("---------使用代理-------------");
		ProxyObject proxy = new ProxyObject(obj);// 傳入代理的真實操作物件obj,由代理完成操作
		proxy.operation();// 獲得操作結果
	}

}
輸出:
---------不使用代理-------------
在RealObject類中,真實的具體操作
---------使用代理-------------
在ProxyObject代理類中,呼叫目標物件之前可做相關的業務操作
在RealObject類中,真實的具體操作
在ProxyObject代理類中,呼叫目標物件之後還可做相關的業務操作
     說明:代理模式中,代理類ProxyObject和真實類RealObject都實現了介面的方法,不同的是代理類的操作方法operation(),不僅呼叫了真實類的操作,還擴充套件了業務功能,因此通過代理的模式,不僅可以實現真實的功能,還可以擴充套件業務功能。

相關文章