文檔查閱說明:
定義:爲其他對象提供一種代理以控制對這個對象的訪問
使用場景:
● 遠程代理;
● 虛擬代理;
● Copy-on-Write 代理;
● 保護(Protect or Access)代理;
● Cache代理;
● 防火牆(Firewall)代理;
● 同步化(Synchronization)代理;
● 智能引用(Smart Reference)代理
注意事項:
1、和適配器模式的區別:適配器模式主要改變所考慮對象的接口,而代理模式不能改變所代理類的接口。
2、和裝飾器模式的區別:裝飾器模式爲了增強功能,而代理模式是爲了加以控制。
普通代理:
在該模式下,調用者只知代理而不用知道真實的角色是誰,屏蔽了真實角色的變更對高層模塊的影響,真實的主題角色想怎麼修改就怎麼修改,對高層次的模塊沒有任何的影響,只要你實現了接口所對應的方法,該模式非常適合對擴展性要求較高的場合。
強制代理:
強制代理的概念就是要從真實角色查找到代理角色,不允許直接訪問真實角色。高層模塊只要調用getProxy就可以訪問真實角色的所有方法,它根本就不需要產生一個代理出來,代理的管理已經由真實角色自己完成。
動態代理:
根據被代理的接口生成所有的方法,也就是說給定一個接口,動態代理會宣稱“我已經實現該接口下的所有方法了”。
兩條獨立發展的線路。動態代理實現代理的職責,業務邏輯Subject實現相關的邏輯功能,兩者之間沒有必然的相互耦合的關係。通知Advice從另一個切面切入,最終在高層模塊也就是Client進行耦合,完成邏輯的封裝任務。
public abstract class Subject {
public abstract void Request();
}
public class RealSubject extends Subject {
@Override
public void Request() {
System.out.println("真實的請求");
}
}
public class Proxy extends Subject {
RealSubject realSubject;
@Override
public void Request() {
if(realSubject == null) {
realSubject = new RealSubject();
}
realSubject.Request();
}
}
public class Test {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.Request();
}
}