給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。

代理的種類:
1. 遠程(Remote)代理:為一個位于不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是在本機器中,也可是在另一臺機器中。
2. 虛擬(Virtual)代理:根據需要創建一個資源消耗較大的對象,使得此對象只在需要時才會被真正創建。
3. Copy-on-Write代理:虛擬代理的一種。把復制(克隆)拖延到只有在客戶端需要時,才真正采取行動。
4. 保護(Protect or Access)代理:控制對一個對象的訪問,如果需要,可以給不同的用戶提供不同級別的使用權限。
5. Cache代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共享這些結果。
6. 防火墻(Firewall)代理:保護目標,不讓惡意用戶接近。
7. 同步化(Synchronization)代理:使幾個用戶能夠同時使用一個對象而沒有沖突。
8. 智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。

示意類圖








1. com.cleversoft.designpatterns.proxy.Subject.java:
package?com.cleversoft.designpatterns.proxy;

public?interface?Subject?{
????
public?void?request();
}

2. com.cleversoft.designpatterns.proxy.RealSubject.java:
package?com.cleversoft.designpatterns.proxy;

public?class?RealSubject?implements?Subject?{

????
public?void?request()?{
????????System.out.println(
"From?real?subject");

????}


}

3. com.cleversoft.designpatterns.proxy.ProxySubject.java:
package?com.cleversoft.designpatterns.proxy;

public?class?ProxySubject?implements?Subject?{
????
private?RealSubject?realSubject;

????
public?ProxySubject()?{
????}


????
public?void?request()?{
????????preRequest();

????????
if?(realSubject?==?null)?{
????????????realSubject?
=?new?RealSubject();
????????}

????????realSubject.request();

????????postRequest();
????}


????
private?void?postRequest()?{
????????System.out.println(
"From?post?request");

????}


????
private?void?preRequest()?{
????????System.out.println(
"From?pre?request");

????}


}

4. com.cleversoft.designpatterns.proxy.Client.java:
package?com.cleversoft.designpatterns.proxy;

public?class?Client?{
????
private?static?Subject?subject;

????
public?static?void?main(String[]?args)?{
????????subject?
=?new?ProxySubject();
????????subject.request();
????}


}


參考資料:
1. 《Java與模式》

歡迎大家訪問我的個人網站 萌萌的IT人