一、問題html
在面向對象系統中,有些對象因爲某種緣由(好比建立對象的開銷很大,或者某些操做須要安全控制,或者須要進程外的訪問等),直接訪問會給調用者帶來麻煩,那麼如何在不損失接口透明性的狀況下,解決這些麻煩?安全
二、解決方案分佈式
經過架設一層中間層,讓這層中間層來解決上面的麻煩,也就是咱們所說的代理。大體的結構轉換圖以下:post
轉換成ui
將一個複雜的系統A,經過假設一層中間層C,將A中的複雜度處理掉,並經過C向B提供一種更靈活,知足B需求的方案.url
案例1、.Net中WebService技術提供了很好的借鑑.代碼以下:spa
#region 基於.Net WebService的分佈式服務 public interface IUser { void GetUser(); void AddUser(); void UpdateUser(); void DeleteUser(); } public class User : IUser { public void AddUser() { } public void DeleteUser() { } public void GetUser() { } public void UpdateUser() { } } #endregion #region 客戶端調用程序 /// <summary> /// 該代理的類的做用是屏蔽分佈式通訊的細節(如協議的處理等),客戶端調用代碼則不須要關注這些細節 /// 只須要關注業務 /// </summary> public class UserProxy : IUser { public UserProxy() { //對對象建立的一種Soap封裝 } public void GetUser() { //對對象訪問的一種Soap封裝 //發送Soap數據,執行分佈式服務中的業務代碼 //若是有返回值,接受返回值Soap數據,解包,轉換成C#代碼 } public void AddUser() { } public void DeleteUser() { } public void UpdateUser() { } }
經過UserProxy類,該類將soap協議的相關處理完成,而後客戶端調用類就不須要關心soap協議的處理,只須要關心業務代碼以下調用便可,這就是代理類的做用.3d
案例2、StringBuilder的Copy-on-Wirte技術代理
StringBuilder sbOne = new StringBuilder("Hello World"); StringBuilder sbTwo = new StringBuilder("Hello World"); StringBuilder sbThree = new StringBuilder("Hello World");
上面的代碼建立了3個StringBuilder類,因爲字符串的實例惟一性和字符串的不變性,關於字符串實例惟一性和字符串的不變性,參考字符、字符串和文本的處理之String類型,能夠得出下面的結構圖:code
3個StringBuilder實例都指向"Hello World"字符串實例,可是當其中一個StringBuilder執行了Replace方法,若是按照這個結構的話,當一個實例對字符串進行修修改操做,那麼其它兩個實例也會共享這個修改操做.但實際上,StringBuilder並非這樣操做的.由於StringBuilder表明的是可變字符串.因此當對StringBuilder實例進行修改對應的字符串也要發生改變,接下來看StringBuilder是如何使用Copy On Write技術對字符串實例進行修改的,代碼以下:
StringBuilder sbOne = new StringBuilder("Hello World"); StringBuilder sbTwo = new StringBuilder("Hello World"); StringBuilder sbThree = new StringBuilder("Hello World"); sbThree.Replace("Hello World", "小超"); Console.WriteLine(sbThree);//輸出小超
根據輸出,發現同一個StringBuilder實例,能夠修改它的值,可是String字符串對象就不能修改.大體的結構圖以下:
這就是Copy On Write技術,而StringBuilder類就至關於一個代理類,它代理的是String類,讓原先沒法修改的字符串實例變得可修改,它就是可變字符串的代理類.