代理模式
代理模式(Proxy)馁龟,為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問想罕。[DP]
代理模式結(jié)構(gòu)圖
基本代碼
Subject類状答,定義了RealSubject和Proxy的共用接口封寞,這樣就在任何使用RealSubject的地方都可以使用Proxy粉洼。
public interface Subject {
void request();
}
RealSubject類节预,定義Proxy所代表的真實(shí)實(shí)體。
public class RealSubject implements Subject {
@Override
public void request() {
print("真實(shí)的請(qǐng)求");
}
}
Proxy類属韧,保存一個(gè)引用使得代理可以訪問實(shí)體安拟,并提供一個(gè)與Subject的接口相同的接口,這樣代理就可以用來代替實(shí)體宵喂。
public class Proxy implements Subject {
RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
}
}
測試代碼
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
代理模式的應(yīng)用
第一去扣,遠(yuǎn)程代理,也就是為一個(gè)對(duì)象在不同的地址空間提供局部代表樊破。這樣可以隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)愉棱。[DP]
第二,虛擬代理哲戚,是根據(jù)需要?jiǎng)?chuàng)建開銷很大的對(duì)象奔滑。通過它來存放實(shí)例化需要很長時(shí)間的真實(shí)對(duì)象。[DP]這樣可以達(dá)到性能的最優(yōu)化顺少,比如打開一個(gè)很大的HTML網(wǎng)頁朋其,里面可能有很多的文字和圖片,但打開速度還是很快脆炎,此時(shí)所看到的是所有的文字梅猿,但圖片卻是一張一張地下載后才能看到。那些未打開的圖片框秒裕,就是通過虛擬代理替代了真實(shí)的圖片袱蚓,此時(shí)代理存儲(chǔ)了真實(shí)圖片的路徑和尺寸。
第三几蜻,安全代理喇潘,用來控制真實(shí)對(duì)象訪問時(shí)的權(quán)限。[DP]一般用于對(duì)象應(yīng)該有不同的訪問權(quán)限的時(shí)候梭稚。
第四颖低,智能指引,是指當(dāng)調(diào)用真實(shí)的對(duì)象時(shí)弧烤,代理處理另外一些事忱屑。[DP]如計(jì)算真實(shí)對(duì)象的引用次數(shù),這樣當(dāng)該對(duì)象沒有引用時(shí),可以自動(dòng)釋放它莺戒;或當(dāng)?shù)谝淮我靡粋€(gè)持久對(duì)象時(shí)粱栖,將它裝入內(nèi)存;或在訪問一個(gè)實(shí)際對(duì)象前脏毯,檢查是否已經(jīng)鎖定它闹究,以確保其他對(duì)象不能改變它。它們都是通過代理在訪問一個(gè)對(duì)象時(shí)附加一些內(nèi)務(wù)處理食店。
代理模式其實(shí)就是在訪問對(duì)象時(shí)引入一定程度的間接性渣淤,因?yàn)檫@種間接性,可以附加多種用途吉嫩。