一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

C#面向?qū)ο笤O(shè)計模式縱橫談:Proxy 代理模式

  直接與間接

  人們對于復(fù)雜的軟件系統(tǒng)常常有一種處理手法,即增加一層間接層,從而對系統(tǒng)獲得一種更為靈活、滿足特定需求的解決方案。

image

  假設(shè)A要訪問B三次。如果A和B是分布式中的兩個機器,那么A需要跨機器調(diào)用B三次就不是很好。如果在A和B之間加一個代理對象C,并且A和C處于同一個地址空間,即同一個機器。那么A和C之間通訊是非常高效的,現(xiàn)在A和C之間調(diào)用三次,到某個觸發(fā)點的時候,和B只需要一次的通訊,這樣性能就會好很多。這樣做還有一個好處,即A不需要再知道分布式通訊的內(nèi)容了。

  現(xiàn)實生活中,其實操作系統(tǒng)就是軟件和硬件之間的代理。

  動機(Motivation)

  在面向?qū)ο笙到y(tǒng)中,有些對象由于某種原因(比如對象創(chuàng)建的開銷很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪問等),直接訪問會給使用者、或者系統(tǒng)結(jié)構(gòu)帶來很多麻煩。如何在不失去透明操作對象的同時來管理/控制這些對象特有的復(fù)雜性?增加一層間接層是軟件開發(fā)中常見的解決方式。

  意圖(Intent)

  為其他對象提供一種代理以控制對這個對象的訪問。

              ——《設(shè)計模式》GoF

  例說Proxy應(yīng)用

image

  HrSystem里面new的Employee對象將位于和HrSystem同樣的地址空間里面,但如果我們需要把Employee作為跨互聯(lián)網(wǎng)的調(diào)用,那么這樣的代碼就不適用了。改進(jìn)后的代碼:

image

  Employee的代理應(yīng)該和Employee具有同樣的接口,它的實現(xiàn)很復(fù)雜。

image

  其中,Employee類運行在InterNET遠(yuǎn)端的一臺機器上,而EmployeeProxy運行在本地的Windows Forms上。這里代理的目的是為了屏蔽分布式通訊、WebService的細(xì)節(jié)。

  結(jié)構(gòu)(Structure)

image

  其中Subject就是HrSystem,它本來是要直接調(diào)用RealSubject的。但是由于WebSerivce這種情況,它需要間接的通過Proxy調(diào)用RealSubject。

  Proxy模式的幾個要點

  “增加一層間接層”是軟件系統(tǒng)中對許多復(fù)雜問題的一種常見解決方法。在面向?qū)ο笙到y(tǒng)中,直接使用某些對象會來帶很多問題,作為間接層的Proxy對象便是解決這一問題的常用手段。具體Proxy設(shè)計模式的實現(xiàn)方法、實現(xiàn)粒度都相差很大,有些可能對單個對象做細(xì)粒度的控制,如copy-on-write技術(shù),有些可能對組件模塊提供抽象代理層,在架構(gòu)層次對對象做Proxy。

  Proxy并不一定要求保持接口的一致性,只要能夠?qū)崿F(xiàn)間接控制,有時候損及一些透明性是可以接受的。

  .NET架構(gòu)中的Proxy應(yīng)用

  WebService的一些例子:

image

  代理對象MathService

image

  客戶端

image

  客戶端使用的是MathService類,這個類是在本地運行的。

  另一個例子:Copy-on-Write

image

image

  左邊是堆,這樣做是比較浪費內(nèi)存的,因為系統(tǒng)中可能有很多字符串重復(fù)。目前大多數(shù)系統(tǒng)都是以下的做法:

image

  但這樣字符串就不能更改了,例如如果要把s1改為大寫,那么必須要另起一個字符串變量:

image

  C#當(dāng)然也是允許對字符串更改的,不過不是string類型,而是StringBuilder類型。

image

  這樣sb就可以被改變。StringBuilder的原理:

image

  sb、sb2和sb3都指向同一個字符串,如果sb把里面內(nèi)容改變,那么就會把hello拷貝到另一塊內(nèi)存,再把內(nèi)容進(jìn)行更改。其實Copy-on-Write應(yīng)該更準(zhǔn)確地描述為Copy-on-Change。

image

  StringBuilder其實就是一種代理,我們本意是想訪問字符串的,StringBuilder就是一種可變字符串的代理,而且StringBuilder也沒有和String保持接口的一致性。我們看看StringBuilder的源代碼:

image

image

  注意Replace方法,當(dāng)需要改變字符串的內(nèi)容時,步驟是先new一個新的String,然后在更改新String的內(nèi)容。但如果只有一個StringBuilder,那么就不需要拷貝到新的區(qū)域,而是直接在原來的String上修改。

it知識庫C#面向?qū)ο笤O(shè)計模式縱橫談:Proxy 代理模式,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 55夜色66夜色国产精品站 | 国产亚洲精品午夜高清影院 | 亚洲人成图片小说网站 | 久久婷婷一区二区三区 | 久久天堂视频 | 国产色在线观看 | 91精品久久久 | 国产麻豆精品视频 | 久久亚洲综合伊人 | 色狠狠成人综合色 | 亚洲欧美日韩精品在线 | 中文字幕一二三四 | 精品久久久久久久 | 97视频在线观看视频在线精品 | 久久成年片色大黄全免费网站 | 国产v精品成人免费视频71sao | 午夜精品久视频在线观看 | 视色4se成人午夜精品 | 亚洲视频国产 | 国产成人精品久久亚洲高清不卡 | 伊人久久大香线蕉综合热线 | 亚洲精品综合网 | 亚洲一区二区三区不卡视频 | 奇米亚洲春色 | 在线看黄网址 | 日韩中文字幕在线免费观看 | 韩国一级做a爰片性色毛片 韩国一区二区三区 | 久久精品国产99国产精品 | 2021国产麻豆剧传媒精品网站 | 久久综合一区二区 | 欧美日韩亚洲国产一区二区三区 | 亚洲夂夂婷婷色拍ww47 | 国产精品美女网站 | 视频在线观看91 | 成人三级视频 | 色综合美国色农夫网 | 精品综合在线 | 九九51精品国产免费看 | 在线观看亚洲一区二区 | 精品一区二区三区免费观看 | 六月婷婷啪啪 |