隨筆-31  評論-2  文章-0  trackbacks-0
            Proxy代理模式是一種結構型設計模式,主要解決的問題是:在直接訪問對象時帶來的問題,比如說:要訪問的對象在遠程的機器上。在面向?qū)ο笙到y(tǒng)中,有些對象由于某些原因(比如對象創(chuàng)建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或者系統(tǒng)結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層。如下圖:
             



                 比如說C和A不在一個服務器上,A要頻繁的調(diào)用C,我們可以在A上做一個代理類Proxy,把訪問C的工作交給Proxy,這樣對于A來說,就好像在直接訪問C的對象。在對A的開發(fā)中我們可以把注意力完全放在業(yè)務的實現(xiàn)上。

                 GoF《設計模式》中說道:為其他對象提供一種代理以控制這個對象的訪問。

                 Proxy模式的結構:
             



                 下面通過一個場景來看看Proxy的實現(xiàn),我們要使用代理類型ProxyClass的對象調(diào)用遠程機器上的一個類型LongDistanceClass的對象。

              首先我們先模擬一個遠程的類型:為了保持對被代理對象使用的透明性,我們使代理類型和被代理類型同時繼承同一個接口IProxy

              接口實現(xiàn):

              interface IProxy

              {

                  string Function1();

                  string Function2();

              }

              遠程對象實現(xiàn):

              /// <summary>

              /// 模擬的遠程對象

              /// </summary>

              public class LongDistanceClass:IProxy

              {

                  #region IProxy 成員

                  public string Function1()

                  {

                      //do someting

                      return "LongDistanceClass.Function1";

                  }

                  public string Function2()

                  {

                      //do someting

                      return "LongDistanceClass.Function2";

                  }

                  #endregion

              }

              接下來就要實現(xiàn)代理類型,使用代理對象訪問模擬的遠程對象,代理類型實現(xiàn)如下:

              public class ProxyClass:IProxy

              {

                  #region IProxy 成員

                  public string Function1()

                  {

                      //to access LongDistanceClass.Function1

                      LongDistanceClass obj = new LongDistanceClass();

                      return obj.Function1();

                  }

                  public string Function2()

                  {

                      //to access LongDistanceClass.Function2

                      LongDistanceClass obj = new LongDistanceClass();

                      return obj.Function2();

                  }

                  #endregion

              }

           

              最后實現(xiàn)客戶端代碼:

              class Class1

              {

                  [STAThread]

                  static void Main(string[] args)

                  {

                      IProxy pro = new ProxyClass();

                      Console.WriteLine(pro.Function1());

                      Console.WriteLine(pro.Function2());

                      Console.Read();

                  }

              }

              運行結果如下:

              LongDistanceClass.Function1

          LongDistanceClass.Function2

                 Proxy模式的要點:

                 1、“增加一層間接層”是軟件系統(tǒng)中對許多負責問題的一種常見解決方法。在面向?qū)ο笙到y(tǒng)中,直接使用某些對象會帶來很多問題,作為間接層的proxy對象便是解決這一問題的常用手段。

                 在我們?nèi)粘5墓ぷ髦幸渤3S玫酱砟J剑热鐚τ谌龑咏Y構或者N- tiers結構中DAL數(shù)據(jù)訪問層,它把對數(shù)據(jù)庫的訪問進行封裝。BLL業(yè)務層的開發(fā)者只是調(diào)用DAL中的方法來獲得數(shù)據(jù)。

                 在比如前一段時間看了看AOP和Remoting方面的資料,對于跨越應用程序域的訪問,要為客戶應用程序提供一個TransparentProxy(透明代理),客戶程序?qū)嶋H上是通過訪問這個代理來訪問實際的類型對象。

          2、具體proxy設計模式的實現(xiàn)方法、實現(xiàn)粒度都相差很大,有些可能對單個對象作細粒度的控制,有些可能對組件模塊提供抽象代理層,在架構層次對對象作proxy。

          3、proxy并不一定要求保持接口的一致性,只要能夠?qū)崿F(xiàn)間接控制,有時候損及一些透明性是可以接受的。例如上面的那個例子,代理類型ProxyClass和被代理類型LongDistanceClass可以不用繼承自同一個接口,正像GoF《設計模式》中說的:為其他對象提供一種代理以控制這個對象的訪問。代理類型從某種角度上講也可以起到控制被代理類型的訪問的作用。
          posted on 2009-08-04 14:44 xiaoxinchen 閱讀(152) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 香港| 云安县| 舟曲县| 贵州省| 屏东市| 法库县| 略阳县| 万宁市| 贵阳市| 靖宇县| 六盘水市| 五大连池市| 碌曲县| 阿拉善右旗| 湟中县| 黑龙江省| 旬阳县| 阜康市| 恭城| 仙游县| 江西省| 醴陵市| 武陟县| 唐山市| 二连浩特市| 湘潭市| 黑山县| 开鲁县| 胶州市| 五原县| 永仁县| 鄂州市| 鄂托克前旗| 富裕县| 临泽县| 红原县| 克东县| 伊川县| 皮山县| 上饶县| 天水市|