欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

(第Ⅲ部分 結構型模式篇) 第13章 代理模式(Pro

系統 1881 0
——.NET設計模式系列之十四
Terrylee ,2006年5月
摘要:在軟件系統中,有些對象有時候由于跨越網絡或者其他的障礙,而不能夠或者不想直接訪問另一個對象,如果直接訪問會給系統帶來不必要的復雜性,這時候可以在客戶程序和目標對象之間增加一層中間層,讓代理對象來代替目標對象打點一切。這就是本文要說的 Proxy 模式。
主要內容
1 .例說 Proxy 模式
2 Proxy 模式效果及實現要點
……
概述
在軟件系統中,有些對象有時候由于跨越網絡或者其他的障礙,而不能夠或者不想直接訪問另一個對象,如果直接訪問會給系統帶來不必要的復雜性,這時候可以在客戶程序和目標對象之間增加一層中間層,讓代理對象來代替目標對象打點一切。這就是本文要說的 Proxy 模式。
意圖
為其他對象提供一種代理以控制對這個對象的訪問。
結構圖
圖1 Proxy模式結構圖
生活中的例子
代理模式提供一個中介以控制對這個對象的訪問。一張支票或銀行存單是賬戶中資金的代理。支票在市場交易中用來代替現金,并提供對簽發人賬號上資金的控制。
圖2使用銀行存單例子的Proxy模式對象圖
Proxy 模式解說
在軟件系統中,我們無時不在跨越障礙,當我們訪問網絡上一臺計算機的資源時,我們正在跨越網絡障礙,當我們去訪問服務器上數據庫時,我們又在跨越數據庫訪問障礙,同時還有網絡障礙??缭竭@些障礙有時候是非常復雜的,如果我們更多的去關注處理這些障礙問題,可能就會忽視了本來應該關注的業務邏輯問題, Proxy 模式有助于我們去解決這些問題。我們以一個簡單的數學計算程序為例,這個程序只負責進行簡單的加減乘除運算: Proxy 模式了。但現在問題是這個 Math 類并沒有部署在我們本地,而是部署在一臺服務器上,也就是說 Math 類根本和我們的客戶程序不在同一個地址空間之內,我們現在要面對的是跨越 Internet 這樣一個網絡障礙:
/**/ /// <summary>

/// Author:Terrylee

/// From: http://terrylee.cnblogs.com

/// </summary>


public class Math
{
public double Add( double x, double y)
{
return x + y;
}


public double Sub( double x, double y)
{
return x - y;
}


public double Mul( double x, double y)
{
return x * y;
}


public double Dev( double x, double y)
{
return x / y;
}

}
如果說這個計算程序部署在我們本地計算機上,使用就非常之簡單了,我們也就不用去考慮
3
這時候調用 Math 類的方法就沒有下面那么簡單了,因為我們更多的還要去考慮網絡的問題,對接收到的結果解包等一系列操作。 Proxy 模式,我們使用一個本地的代理來替 Math 類打點一切,即為我們的系統引入了一層間接層,示意圖如下
/**/ /// <summary>

/// Author:Terrylee

/// From: http://terrylee.cnblogs.com

/// </summary>


public class App
{
public static void Main()
{
Mathmath
= new Math();

// 對接收到的結果數據進行解包

double addresult = math.Add( 2 , 3 );

double subresult = math.Sub( 2 , 3 );

double mulresult = math.Mul( 2 , 3 );

double devresult = math.Dev( 2 , 3 );
}

}
為了解決由于網絡等障礙引起復雜性,就引出了
4
我們在 MathProxy 中對實現 Math 數據類的訪問,讓 MathProxy 來代替網絡上的 Math 類,這樣我們看到 MathProxy 就好像是本地 Math 類,它與客戶程序處在了同一地址空間內:
Math 類的代理,存在的一個問題是我們在 MathProxy 類中調用了原實現類 Math 的方法,但是 Math 并不一定實現了所有的方法,為了強迫 Math 類實現所有的方法,另一方面,為了我們更加透明的去操作對象,我們在 Math 類和 MathProxy 類的基礎上加上一層抽象,即它們都實現與 IMath 接口,示意圖如下:
/**/ /// <summary>

/// Author:Terrylee

/// From: http://terrylee.cnblogs.com

/// </summary>


public class MathProxy
{
private Mathmath = new Math();

// 以下的方法中,可能不僅僅是簡單的調用Math類的方法

public double Add( double x, double y)
{
return math.Add(x,y);
}


public double Sub( double x, double y)
{
return math.Sub(x,y);
}


public double Mul( double x, double y)
{
return math.Mul(x,y);
}


public double Dev( double x, double y)
{
return math.Dev(x,y);
}

}
現在可以說我們已經實現了對
示意性代碼如下:
/**/ /// <summary>

/// Author:Terrylee

/// From: http://terrylee.cnblogs.com

/// </summary>


public interface IMath
{
double Add( double x, double y);

double Sub( double x, double y);

double Mul( double x, double y);

double Dev( double x, double y);
}


Math類和MathProxy類分別實現IMath接口:

public class MathProxy:IMath
{
//
}


public class Math:IMath
{
//
}
此時我們在客戶程序中就可以像使用Math類一樣來使用MathProxy類了:
/**/ /// <summary>

/// Author:Terrylee

/// From: http://terrylee.cnblogs.com

/// </summary>


public class App
{
public static void Main()
{
MathProxyproxy
= new MathProxy();

double addresult = proxy.Add( 2 , 3 );

double subresult = proxy.Sub( 2 , 3 );

double mulresult = proxy.Mul( 2 , 3 );

double devresult = proxy.Dev( 2 , 3 );
}

}
到這兒整個使用Proxy模式的過程就完成了,回顧前面我們的解決方案,無非是在客戶程序和Math類之間加了一個間接層,這也是我們比較常見的解決問題的手段之一。另外,對于程序中的接口Imath,并不是必須的,大多數情況下,我們為了保持對對象操作的透明性,并強制實現類實現代理類所要調用的所有的方法,我們會讓它們實現與同一個接口。但是我們說代理類它其實只是在一定程度上代表了原來的實現類,所以它們有時候也可以不實現于同一個接口。
效果及實現要點
Proxy 模式根據種類不同,效果也不盡相同:
1 .遠程( Remote )代理:為一個位于不同的地址空間的對象提供一個局域代表對象。這個不同的地址空間可以是在本機器中,也可是在另一臺機器中。遠程代理又叫做大使( Ambassador )。好處是系統可以將網絡的細節隱藏起來,使得客戶端不必考慮網絡的存在??蛻敉耆梢哉J為被代理的對象是局域的而不是遠程的,而代理對象承擔了大部份的網絡通訊工作。由于客戶可能沒有意識到會啟動一個耗費時間的遠程調用,因此客戶沒有必要的思想準備。
2 .虛擬( Virtual )代理:根據需要創建一個資源消耗較大的對象,使得此對象只在需要時才會被真正創建。使用虛擬代理模式的好處就是代理對象可以在必要的時候才將被代理的對象加載;代理可以對加載的過程加以必要的優化。當一個模塊的加載十分耗費資源的情況下,虛擬代理的好處就非常明顯。
3 Copy-on-Write 代理:虛擬代理的一種。把復制(克隆)拖延到只有在客戶端需要時,才真正采取行動。
4 .保護( Protect or Access )代理:控制對一個對象的訪問,如果需要,可以給不同的用戶提供不同級別的使用權限。保護代理的好處是它可以在運行時間對用戶的有關權限進行檢查,然后在核實后決定將調用傳遞給被代理的對象。
5 Cache 代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共享這些結果。
6 .防火墻( Firewall )代理:保護目標,不讓惡意用戶接近。
7 .同步化( Synchronization )代理:使幾個用戶能夠同時使用一個對象而沒有沖突。
8 .智能引用( Smart Reference )代理:當一個對象被引用時,提供一些額外的操作,比如將對此對象調用的次數記錄下來等。
總結
在軟件系統中,增加一個中間層是我們解決問題的常見手法,這方面 Proxy 模式給了我們很好的實現。
參考資料
Erich Gamma 等,《設計模式:可復用面向對象軟件的基礎》,機械工業出版社
Robert C.Martin ,《敏捷軟件開發:原則、模式與實踐》,清華大學出版社
閻宏,《 Java 與模式》,電子工業出版社
Alan Shalloway James R. Trott ,《 Design Patterns Explained 》,中國電力出版社
MSDN WebCast C# 面向對象設計模式縱橫談 (13) Proxy 代理模式 ( 結構型模式 )

(第Ⅲ部分 結構型模式篇) 第13章 代理模式(Proxy Pattern)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美激情欧美激情在线五月 | 九九精品视频在线播放 | 新版天堂资源中文在线 | 一区二区三区四区五区中文字幕 | 99精品国产高清一区二区麻豆 | 国产精品精品 | 蜜桃精品噜噜噜成人av | 成人国产精品视频 | 精品日韩欧美一区二区三区在线播放 | 久久久综合网 | 草草在线免费视频 | 亚洲国产精品视频一区 | 亚洲专区在线 | 91嫩草国产线免费观看 | 国产免费福利视频一区二区 | 色搞搞 | 欧美日韩国产中文字幕 | 久久久精彩视频 | 午夜影皖 | 图片区乱熟图片区小说 | 成人性视频免费网站 | 欧美区在线播放 | 亚洲一区二区中文字幕 | 国产91精品一区二区 | 成人一级视频 | 欧美国产一区二区 | 黑人精品欧美一区二区蜜桃 | 一级免费黄色免费片 | 国产在线精品一区二区三区 | 国产高清在线精品免费 | 看片亚洲 | 国产亚洲精品看片在线观看 | 日本一区免费在线观看 | 日韩第一| 亚洲精品午夜在线观看 | 91精品电影 | 国产精品日日摸夜夜添夜夜av | 小明成人永久在线看 | 日韩在线视频导航 | 免费一区二区三区免费视频 | 日本在线观看 |