屏蔽真實行爲的訪問,讓程序更加安全。
可以對真實行爲的調用進行控制。
一個典型的代理模式有三要素
1.代理類與被代理類要實現同一個接口.
2.在代理類中持有被代理對象.
3.在代理類中調用被代理的行爲。
即:
共同接口
public interface Action {
public void doSomething();
}
真實對象
public class RealObject implements Action{
public void doSomething() {
System.out.println("do something");
}
}
代理對象
public class Proxy implements Action {
private Action realObject;
public Proxy(Action realObject) {
this.realObject = realObject;
}
public void doSomething() {
System.out.println("proxy do");
realObject.doSomething();
}
}
運行代碼
Proxy proxy = new Proxy(new RealObject());
proxy.doSomething();
這樣就可以不用創建 真實對象了, 只是創建代理對象 就可以做到真實對象做的事情了。
可以很好的隱藏真實對象。
然後再在代理類中相同的方法裏面加些東西,就可以爲原功能進行擴展了。
一般將這種代理模式稱爲靜態代理
靜態代理的優點和缺點
這種代理模式的優點: 擴展原功能,不侵入原代碼。
這種代理模式的缺點:如果有多個真實類對象,要麼創建多個代理類,要麼一個代理類添加多個接口,但都很繁瑣。
動態代理
通過使用動態代理,我們可以通過在運行時,動態生成一個持有RealObject、並實現代理接口的Proxy,同時注入我們相同的擴展邏輯
也就是輸入被代理對象、接口 就可以得到一個代理對象,然後執行代理對象的方法。
一般有兩種方式:
1.通過jdk中提供的Proxy類來實現
這種方式要求,被代理類必須實現接口。
簡單說,只能爲接口做代理.
2.通過cglib來實現。
它不要求,實現接口。
jdk動態代理 需要輸入被代理對象、接口
cglib不要求輸入接口