代理模式(Proxy)芦岂,為一個(gè)對(duì)象提供一種代理以實(shí)現(xiàn)對(duì)這個(gè)對(duì)象的訪問惰赋。
代理模式涉及到3個(gè)部分:
- 公用接口:定義了真實(shí)實(shí)體和代理類的公用接口粹湃。
- 真實(shí)實(shí)體:具體的真實(shí)實(shí)體。
- 代理類:保存了對(duì)真實(shí)實(shí)體的引用灰署,使其能夠訪問真實(shí)實(shí)體判帮,并提供與真實(shí)實(shí)體相同的接口以達(dá)到代理真實(shí)實(shí)體的目的局嘁。
丈夫前幾天網(wǎng)購(gòu)了一個(gè)東西,今天快遞要送過來晦墙,但是丈夫今天不在家悦昵,于是委托妻子幫忙收取快遞。
在這個(gè)場(chǎng)景中晌畅,收取快遞是丈夫和妻子的公用行為但指,所以定義了一個(gè)快遞接口,它擁有一個(gè)收取方法抗楔。丈夫和妻子都去實(shí)現(xiàn)這個(gè)接口棋凳,丈夫在這里扮演了真實(shí)實(shí)體的角色,妻子在這里是幫忙收取快遞连躏,所以起到的是一個(gè)代理類的作用剩岳。
- 快遞接口
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();
}
}
- 客戶端測(cè)試類
public class Client {
public static void main(String[] args) {
Husband husband = new Husband();
WifeProxy wifeProxy = new WifeProxy(husband);
wifeProxy.accept();
}
}
運(yùn)行結(jié)果:
accept delivery
代理模式的優(yōu)點(diǎn)在于職責(zé)清晰和對(duì)擴(kuò)展的開放,并且智能地實(shí)現(xiàn)了差異化入热∨淖兀可以用此來達(dá)到對(duì)真實(shí)實(shí)體對(duì)外界的一定程度的屏蔽,實(shí)現(xiàn)對(duì)真實(shí)對(duì)象訪問權(quán)限的一種控制才顿∧妫或者由于真實(shí)對(duì)象的創(chuàng)建所要的開銷較大,那么用代理的方式可以達(dá)到性能的優(yōu)化郑气。當(dāng)然也可以在代理中處理一些額外的事情,但是這樣做會(huì)在一定程度上破壞代理的本意腰池,不建議這樣使用尾组。
由于多加了一個(gè)代理,那么使得原來可以直接訪問真實(shí)對(duì)象變成了需要通過代理來訪問真實(shí)對(duì)象示弓,這對(duì)處理請(qǐng)求的速度可能會(huì)有一定的影響讳侨。