文章目錄
- Gof定義
- 動機
- Proxy模式的應用情境
- Proxy模式的幾個要點
Gof定義
為其他對象提供一種代理以控制對這個對象的訪問。
動機
在物件導向系統中,有些對象由於某種原因(比如對象建立的開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問等),直接存取會給使用者、或者系統結構帶來很多麻煩。如何在不失去透明操作對象的同時來管理/控制這些對象特有的複雜性?增加一層間接層是軟體開發中常見的解決方式。看下結構圖:
Subject:該類中定義了一些RealSubject和Proxy中共有的方法。
RealSubject:這個類是Proxy所要代理的實體類,用戶端只和Proxy互動。
代碼實現:
/// <summary>/// 公用介面/// </summary>interface ISubject{ void Request();}/// <summary>/// 被代理的類/// </summary>public class RealSubject : ISubject{ public void Request() { Console.WriteLine("被代理類的請求"); }}/// <summary>/// 代理類/// </summary>public class Proxy : ISubject{ RealSubject realSubject=new RealSubject(); public void Request() { realSubject.Request(); }}/// <summary>/// 客戶代碼/// </summary>/// <param name="args"></param>static void Main(string[] args){ Proxy proxy = new Proxy(); proxy.Request();}
上面的代碼非常簡單,在用戶端使用的是Proxy類,其實調用的是RealSubject類中的方法,起到了代理的目的。
Proxy模式的應用情境
遠程代理,也就是為一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在不同地址空間的事實。(net中的webservice)
虛擬代理,根據需要建立開銷很大的對象。通過他來存放執行個體化需要很長時間的真實對象。
安全代理,用來控制真實對象訪問時的許可權。
智能指引,指當調用這是對象時,代理處理另外一些事情。
[以上四點摘自《大話設計模式》]
Proxy模式的幾個要點
“增加一層間接層”是軟體系統中對許多複雜問題的一種常見解決方案。在物件導向系統中,直接使用某些對象會帶來很多問題,作為間接層的proxy對象便是解決這一問題的常用手段。
具體proxy設計模式的實現方法、實現粒度都相差很大,有些可能對單個對象做細粒度的控制,如copy-on-write技術,有些可能對組件模組提供抽象代理層,在架構層次對對象做proxy。
Proxy並不一定要求保持介面的一致性,只要能夠實現間接控制,有時候損及一些透明性是可以接受的。
返回開篇(索引)