代理模式(Proxy),為一個對象提供一種代理以實現對這個對象的訪問。
代理模式涉及到3個部分:
- 公用接口:定義了真實實體和代理類的公用接口。
- 真實實體:具體的真實實體。
- 代理類:保存了對真實實體的引用,使其能夠訪問真實實體,并提供與真實實體相同的接口以達到代理真實實體的目的。
丈夫前幾天網購了一個東西,今天快遞要送過來,但是丈夫今天不在家,于是委托妻子幫忙收取快遞。
在這個場景中,收取快遞是丈夫和妻子的公用行為,所以定義了一個快遞接口,它擁有一個收取方法。丈夫和妻子都去實現這個接口,丈夫在這里扮演了真實實體的角色,妻子在這里是幫忙收取快遞,所以起到的是一個代理類的作用。
代理模式類圖
- 快遞接口
public interface Delivery {
void accept();
}
- 丈夫類
public class Husband implements Delivery{
@Override
public void accept() {
System.out.print("accept delivery");
}
}
- 妻子代理類
public class WifeProxy implements Delivery{
private Husband husband;
public WifeProxy(Husband husband) {
this.husband = husband;
}
@Override
public void accept() {
husband.accept();
}
}
- 客戶端測試類
public class Client {
public static void main(String[] args) {
Husband husband = new Husband();
WifeProxy wifeProxy = new WifeProxy(husband);
wifeProxy.accept();
}
}
運行結果:
accept delivery
代理模式的優點在于職責清晰和對擴展的開放,并且智能地實現了差異化。可以用此來達到對真實實體對外界的一定程度的屏蔽,實現對真實對象訪問權限的一種控制。或者由于真實對象的創建所要的開銷較大,那么用代理的方式可以達到性能的優化。當然也可以在代理中處理一些額外的事情,但是這樣做會在一定程度上破壞代理的本意,不建議這樣使用。
由于多加了一個代理,那么使得原來可以直接訪問真實對象變成了需要通過代理來訪問真實對象,這對處理請求的速度可能會有一定的影響。