代理模式與裝飾者模式非常相似,容易使人無(wú)法區(qū)別
裝飾器模式關(guān)注于在一個(gè)對(duì)象上動(dòng)態(tài)的添加方法,然而代理模式關(guān)注于控制對(duì)對(duì)象的訪問(wèn)。
用代理模式,代理類(lèi)(proxy class)可以對(duì)它的客戶(hù)隱藏一個(gè)對(duì)象的具體信息。因此,當(dāng)使用代理模式的時(shí)候,我們常常在一個(gè)代理類(lèi)中創(chuàng)建一個(gè)對(duì)象的實(shí)例。并且,當(dāng)我們使用裝飾器模式的時(shí)候,我們通常的做法是將原始對(duì)象作為一個(gè)參數(shù)傳給裝飾者的構(gòu)造器。
- 使用代理模式,代理和真實(shí)對(duì)象之間的的關(guān)系通常在編譯時(shí)就已經(jīng)確定了.
- 裝飾者能夠在運(yùn)行時(shí)遞歸地被構(gòu)造。
代碼:
public interface Sourceable {
public void method();
}
public class Source implements Sourceable {
@Override
public void method() {
System.out.println("the original method!");
}
}
public class Proxy implements Sourceable {
private Source source;
public Proxy(){
super();
/**
*區(qū)別就在下面這句,是創(chuàng)建的,非作為參數(shù)傳進(jìn)來(lái)的
*/
this.source = new Source();
}
@Override
public void method() {
before();
source.method();
atfer();
}
private void atfer() {
System.out.println("after proxy!");
}
private void before() {
System.out.println("before proxy!");
}
}
使用:
public class ProxyTest {
public static void main(String[] args) {
Sourceable source = new Proxy(); //區(qū)別(代理,裝飾)
source.method();
}
}
代理模式的應(yīng)用場(chǎng)景:
如果已有的方法在使用的時(shí)候需要對(duì)原有的方法進(jìn)行改進(jìn),此時(shí)有兩種辦法:
- 修改原有的方法來(lái)適應(yīng)。這樣違反了“對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉”的原則。
- 就是采用一個(gè)代理類(lèi)調(diào)用原有的方法,且對(duì)產(chǎn)生的結(jié)果進(jìn)行控制。這種方法就是代理模式。
使用代理模式,可以將功能劃分的更加清晰,有助于后期維護(hù)!