在上一篇你會在C#的類庫中添加web service嗎? 我談到了web service的應用
本人一直學習設計模式
而web service就是代理模式的一種特別經典的應用
名詞解釋
代理代理服務器即Proxy服務器在互聯網上的完成跑腿服務當你在浏覽器中設置了某個Proxy服務器之後由你的浏覽器所發出的任何要求都會被送到Proxy服務器上去由這台Proxy服務器代為處理
現實中真實例子:
在工廠和銷售商之間也是這種類似的代理關系工廠所生產的產品要想銷售出去首先必須要有客戶但是工廠是不希望這樣的直接客戶直接到工廠來買產品原因可想而之我這裡列了幾項
第一工廠並沒有那麼多時間去接待數量眾多的客戶
第二工廠並不一定具有一個非常出色銷售團隊
這樣工廠就非常希望找到一個代理來幫工廠完成銷售任務工廠把產品交給代理代理負責打廣告銷售售後服務等等在電腦城中當我們diy電腦的時候商家會到不同的硬件代理商那邊去拿相關的配件例如inter的cpu電腦城中有很多商家做為intel的代理他們都賣intel的cpu代理商負責銷售cpu 發放質保卡等在某種程度上來說代理就代表了intel(部分權利)
代理商和工廠之間有一個共同的特點他們都擁有intel的cpu他們之間的利潤成正比說的抽象點就是他們之間具備共同的接口客戶可以和代理商溝通特殊情況下可以直接和工廠溝通例如代理商找不到了產品壞了此時要修這時就要直接訪問工廠了說的抽象點就是客戶端可以通過代理來訪問真實的類也可以通過代理直接訪問真實類
這樣就非常清晰的顯示出代理模式的結構元素
抽象角色代理和真實類共同接口
真實角色代理角色所代表的真實對象
: 代理角色它的內部含真實角色的引用它可以訪問真實角色中的任何公有方法
代理模式的類圖:
代理模式的作用
在某些情況下客戶不想或者不能夠直接引用一個對象而代理對象可以在客戶端和目標對象之間起到中介的作用例如在web application中添加web service此時就會生成一個代理這個代理負責訪問遠程服務生成真實代理對象借助客戶端調用
web service生成代碼如下:SettingsDesignercs從中可以看出它完成了連接遠程服務的功能至於詳細的原理本人不才望各位指點
//
// <auto
generated>
// 此代碼由工具生成
// 運行庫版本:
//
// 對此文件的更改可能會導致不正確的行為
並且如果
// 重新生成代碼
這些更改將會丟失
// </auto
generated>
//
namespace MyWebService
Web
Properties {
[global::System
Runtime
CompilerServices
CompilerGeneratedAttribute()]
[global::System
CodeDom
Compiler
GeneratedCodeAttribute(
Microsoft
VisualStudio
Editors
SettingsDesigner
SettingsSingleFileGenerator
)]
internal sealed partial class Settings : global::System
Configuration
ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System
Configuration
ApplicationSettingsBase
Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System
Configuration
ApplicationScopedSettingAttribute()]
[global::System
Diagnostics
DebuggerNonUserCodeAttribute()]
[global::System
Configuration
SpecialSettingAttribute(global::System
Configuration
SpecialSetting
WebServiceUrl)]
[global::System
Configuration
DefaultSettingValueAttribute(
)]
public string MyWebService_Web_localhost_Service
{
get {
return ((string)(this[
MyWebService_Web_localhost_Service
]));
}
}
}
}
代理模式在眾多模式中都非常眼熟
在adapter中也有引用對象的存在
在Decorator中也有引用對象
它們的共同特點都是一個類包含另一個類的引用
可以通過它訪問被引用對象所有公有方法
但是它們之間又存在不同點
無論是adaoter模式還是decoraor模式
它們存在
引用
類之間都不必擁有共同的接口
它們之間可以是完成不相關的對象
代理模式中的代理對象和真實對象之間
無論訪問誰
最終訪問的是同一對象
即真實對象
它們之間並沒有發生質的變化
:adapter模式中存在的引用
是在一個類中
引用另一個類中的方法
使其方法簽名發生變化
是外表變了
本質沒變
decorator中存在的引用
是在舊類的基礎了增加新的功能
From:http://tw.wingwit.com/Article/program/net/201311/13923.html