1. 程式人生 > >設計模式:代理模式(Proxy Pattern)

設計模式:代理模式(Proxy Pattern)

一、類圖

二、模式定義

代理模式:

給某一個物件提供一個代理或佔位符,並由代理物件來控制對原物件的訪問。

三、模式角色

(1) Subject(抽象主題角色):

它聲明瞭真實主題和代理主題的共同介面,這樣一來在任何使用真實主題的地方都可以使用代理主題,客戶端通常需要針對抽象主題角色進行程式設計。

(2) Proxy(代理主題角色):

  1. 它包含了對真實主題的引用,從而可以在任何時候操作真實主題物件;
  2. 在代理主題角色中提供一個與真實主題角色相同的介面,以便在任何時候都可以替代真實主題;
  3. 代理主題角色還可以控制對真實主題的使用,負責在需要的時候建立和刪除真實主題物件,並對真實主題物件的使用加以約束
  4. 通常,在代理主題角色中,客戶端在呼叫所引用的真實主題操作之前或之後還需要執行其他操作,而不僅僅是單純呼叫真實主題物件中的操作。

(3) RealSubject(真實主題角色):

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

四、程式碼示例

(1) Subject(抽象主題角色):

package com.yan.pattern.proxy;

public abstract class Subject {
	public abstract void requset();
}

(2) Proxy(代理主題角色):

package com.yan.pattern.proxy;

public class Proxy extends Subject {
	Subject subject = new RealSubject();

	@Override
	public void requset() {
		requestBefore();
		
		subject.requset();
		
		requestAfter();
	}
	
	private void requestBefore() {
		System.out.println("我是代理類的方法:我可以在呼叫真實物件 前 做一些事情,比如驗證");
	}
	
	private void requestAfter() {
		System.out.println("我是代理類的方法:我可以在呼叫真實物件 後 做一些事情,比如對資料進行處理");
	}

}

(3) RealSubject(真實主題角色):

package com.yan.pattern.proxy;

public class RealSubject extends Subject{

	@Override
	public void requset() {
		System.out.println("真正請求的地方");
		
	}

}

(4)Client(客戶端測試)

package com.yan.pattern.proxy;

public class Client {
	public static void main(String[] args) {
		Subject subject = new Proxy();
		subject.requset();
	}
}

(5)客戶端測試結果

我是代理類的方法:我可以在呼叫真實物件 前 做一些事情,比如驗證
真正請求的地方
我是代理類的方法:我可以在呼叫真實物件 後 做一些事情,比如對資料進行處理