23種設計模式(23):代理模式
阿新 • • 發佈:2018-10-05
public 附加 ade 調用 action new 參與 proxy inter
概述:
為其他對象提供一種代理以控制對這個對象的訪問。
類型:結構型模式。
類圖:
適用性:
1.遠程代理(RemoteProxy)為一個對象在不同的地址空間提供局部代表。
2.虛代理(VirtualProxy)根據需要創建開銷很大的對象。
3.保護代理(ProtectionProxy)控制對原始對象的訪問。
4.智能指引(SmartReference)取代了簡單的指針,它在訪問對象時執行一些附加操作。
參與者:
1.Proxy
保存一個引用使得代理可以訪問實體。若RealSubject和Subject的接口相同,Proxy會引用Subject。
提供一個與Subject的接口相同的接口,這樣代理就可以用來替代實體。
控制對實體的存取,並可能負責創建和刪除它。
其他功能依賴於代理的類型:
2.RemoteProxy負責對請求及其參數進行編碼,並向不同地址空間中的實體發送已編碼的請求。
3.VirtualProxy可以緩存實體的附加信息,以便延遲對它的訪問。
4.ProtectionProxy檢查調用者是否具有實現一個請求所必需的訪問權限。
5.Subject定義RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。
6.RealSubject定義Proxy所代表的實體。
例子:
Proxy
public class ProxyObject implements Object {
Object obj;
public ProxyObject() {
System.out.println("這是代理類");
obj = new ObjectImpl();
}
public void action() {
System.out.println("代理開始");
obj.action();
System.out.println("代理結束");
}
}
Subject
public interface Object {
void action();
}
RealSubject
public class ObjectImpl implements Object {
public void action() {
System.out.println("========");
System.out.println("========");
System.out.println("這是被代理的類");
System.out.println("========");
System.out.println("========");
}
}
Test
public class Test {
public static void main() {
Object obj = new ProxyObject();
obj.action();
}
}
result:
這是代理類
代理開始
========
========
這是被代理的類
========
========
代理結束
23種設計模式(23):代理模式