給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)原對(duì)象的引用。

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

示意類圖








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與模式》

歡迎大家訪問(wèn)我的個(gè)人網(wǎng)站 萌萌的IT人