<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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



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

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

           Proxy模式的結構:
       



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

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

        接口實現:

        interface IProxy

        {

            string Function1();

            string Function2();

        }

        遠程對象實現:

        /// <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

        }

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

        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

        }

     

        最后實現客戶端代碼:

        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、“增加一層間接層”是軟件系統中對許多負責問題的一種常見解決方法。在面向對象系統中,直接使用某些對象會帶來很多問題,作為間接層的proxy對象便是解決這一問題的常用手段。

           在我們日常的工作中也常常用到代理模式,比如對于三層結構或者N- tiers結構中DAL數據訪問層,它把對數據庫的訪問進行封裝。BLL業務層的開發者只是調用DAL中的方法來獲得數據。

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

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

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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲av无码国产精品色在线看不卡| 野花香高清在线观看视频播放免费| 和日本免费不卡在线v| 久久精品国产亚洲av成人| 一个人免费视频在线观看www| 中文字幕亚洲专区| 中文字幕的电影免费网站| 亚洲韩国精品无码一区二区三区 | 亚洲av无码专区在线电影天堂| 91精品免费国产高清在线| 亚洲男人电影天堂| 中文毛片无遮挡高潮免费| 亚洲色欲色欲www| 四虎成人免费大片在线| 美女隐私免费视频看| 精品国产亚洲男女在线线电影| 久久久久久久国产免费看| 亚洲国产精品婷婷久久| 久久久久久免费视频| 日本亚洲欧美色视频在线播放| 亚洲人成无码www久久久| 免费黄网站在线看| 亚洲人成7777| 国产做床爱无遮挡免费视频| 一个人看的www免费高清| 久久精品国产亚洲AV麻豆王友容 | ZZIJZZIJ亚洲日本少妇JIZJIZ| 伊人久久大香线蕉免费视频| 亚洲成人高清在线观看| 日本牲交大片免费观看| 国产va免费观看| 亚洲成人免费电影| xvideos亚洲永久网址| 久久99热精品免费观看牛牛| 波多野结衣亚洲一级| 亚洲日本一区二区一本一道| 亚洲香蕉免费有线视频| 校园亚洲春色另类小说合集| 国产亚洲免费的视频看| 大香人蕉免费视频75| 免费萌白酱国产一区二区三区 |