Franky's LIFE

          Anything... ...

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

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

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

          ?????? Proxy 模式的結(jié)構(gòu):
          ???

          ?????? 下面通過一個場景來看看 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();

          ??????? }

          ??? }

          ??? 運行結(jié)果如下:

          ??? LongDistanceClass.Function1

          LongDistanceClass.Function2

          ?????? Proxy 模式的要點:

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

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

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

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

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

          posted on 2007-03-19 21:01 Franky 閱讀(176) 評論(0)  編輯  收藏 所屬分類: IT知識
          主站蜘蛛池模板: 宝坻区| 朝阳市| 富民县| 巢湖市| 子长县| 曲靖市| 金坛市| 富顺县| 浑源县| 莱阳市| 海口市| 玛多县| 房山区| 昔阳县| 清丰县| 揭西县| 蓝山县| 珠海市| 盐边县| 从化市| 龙游县| 德惠市| 报价| 肃北| 永顺县| 新丰县| 洪泽县| 蒲江县| 阜宁县| 三亚市| 寿阳县| 武宁县| 玛沁县| 四子王旗| 北宁市| 临澧县| 安塞县| 新疆| 东源县| 博湖县| 积石山|