一、定義
代理模式就是中間層。可以幫助我們增加或者減少對目標類的訪問。
二、例項
我在專案中會遇見這樣的情況,類A中的方法是protected,但是此時另外一個分繼承自A類的B類要使用A中的個別方法。
比如這樣:
public class Collect { protected void GetJson(string url) { Console.WriteLine("獲取Json."); } } public class Context { public void GetHtmlFromUrl(string url) { //這裡想用 Collect中的GetJson()方法 } }
好吧,那就增加一層代理,讓代理去搞定:
public class Collect { protected void GetJson(string url) { Console.WriteLine("獲取Json."); } } public class JsonProxy : Collect { public void GetJsonFromUrl(string url) { base.GetJson(url); } } public class Context { private JsonProxy jp = new JsonProxy(); public void GetJson(string url) { jp.GetJsonFromUrl(url); } }
客戶端:
Proxy.Context cx = new Proxy.Context(); cx.GetJson("URL"); Console.ReadKey();
正規一點的代理模式:這裡我私自加了單例模式在裡面
public interface JsonProxy { void GetJsonFromUrl(string url); } public class Collect:JsonProxy { protected void GetJson(string url) { Console.WriteLine("執行受保護方法GetJson(),獲取Json."); } public void GetJsonFromUrl(string url) { this.GetJson(url); } } public class Proxy : JsonProxy { private static Collect collect { get; set; } public static Proxy Instance { get; set; } private Proxy() { } static Proxy() { Instance = new Proxy(); collect = new Collect(); Console.WriteLine("單例 : 代理."); } public void GetJsonFromUrl(string url) { collect.GetJsonFromUrl(url); } }
客戶端:
//-----------------------代理模式--------------------- System.Threading.Tasks.Parallel.For(0, 500, t => { Proxy.Proxy.Instance.GetJsonFromUrl("URL"); }); Console.ReadKey();
三、優缺點
優:
- 代理模式能夠將呼叫用於真正被呼叫的物件隔離,在一定程度上降低了系統的耦合度;
- 代理物件在客戶端和目標物件之間起到一箇中介的作用,這樣可以起到對目標物件的保護。代理物件可以在對目標物件發出請求之前進行一個額外的操作,例如許可權檢查等。
缺:
- 由於在客戶端和真實主題之間增加了一個代理物件,所以會造成請求的處理速度變慢
- 實現代理類也需要額外的工作,從而增加了系統的實現複雜度。