老生常谈:代理模式
在上一篇你会在C#的类库中添加web service吗? 我谈到了web service的应用,本人一直学习设计模式,而web service就是代理模式的一种特别经典的应用。
名词解释:
代理:代理服务器,即Proxy服务器,在互联网上的完成跑腿服务。当你在浏览器中设置了某个Proxy服务器之后,由你的浏览器所发出的任何要求,都会被送到Proxy服务器上去,由这台Proxy服务器代为处理。
现实中真实例子:
在工厂和销售商之间也是这种类似的代理关系,工厂所生产的产品要想销售出去,首先必须要有客户,但是工厂是不希望这样的直接客户直接到工厂来买产品,原因可想而之,我这里列了几项:
第一:工厂并没有那么多时间去接待数量众多的客户。
第二:工厂并不一定具有一个非常出色销售团队。
这样工厂就非常希望找到一个代理,来帮工厂完成销售任务。工厂把产品交给代理,代理负责打广告,销售,售后服务等等。在电脑城中,当我们diy电脑的时候,商家会到不同的硬件代理商那边去拿相关的配件,例如inter的cpu,电脑城中有很多商家做为intel的代理,他们都卖intel的cpu.代理商负责销售cpu, 发放质保卡等。在某种程度上来说,代理就代表了intel(部分权利)。
代理商和工厂之间有一个共同的特点:他们都拥有intel的cpu,他们之间的利润成正比。说的抽象点就是他们之间具备共同的接口。客户可以和代理商沟通,特殊情况下可以直接和工厂沟通,例如,代理商找不到了,产品坏了,此时要修,这时就要直接访问工厂了。说的抽象点就是客户端可以通过代理来访问真实的类,也可以通过代理直接访问真实类。
这样就非常清晰的显示出代理模式的结构元素:
1:抽象角色:代理和真实类共同接口。
2:真实角色:代理角色所代表的真实对象 .
3: 代理角色:它的内部含真实角色的引用。它可以访问真实角色中的任何公有方法。
代理模式的类图:
代理模式的作用:
在某些情况下,客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。例如在web application中添加web service,此时就会生成一个代理,这个代理负责访问远程服务,生成真实代理对象借助客户端调用。
web service生成代码如下:Settings.Designer.cs,从中可以看出它完成了连接远程服务的功能,至于详细的原理本人不才,望各位指点。
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.1433
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace MyWebService.Web.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
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("http://localhost/MyWebService.Ws/Service1.asmx")]
public string MyWebService_Web_localhost_Service1 {
get {
return ((string)(this["MyWebService_Web_localhost_Service1"]));
}
}
}
}
代理模式在众多模式中都非常眼熟,在adapter中也有引用对象的存在,在Decorator中也有引用对象.它们的共同特点都是一个类包含另一个类的引用,可以通过它访问被引用对象所有公有方法。但是它们之间又存在不同点:无论是adaoter模式还是decoraor模式,它们存在“引用”类之间都不必拥有共同的接口,它们之间可以是完成不相关的对象。
1:代理模式中的代理对象和真实对象之间,无论访问谁,最终访问的是同一对象,即真实对象,它们之间并没有发生质的变化。
2 :adapter模式中存在的引用,是在一个类中,引用另一个类中的方法,使其方法签名发生变化。是外表变了,本质没变。
3:decorator中存在的引用,是在旧类的基础了增加新的功能。
注:
本文引用:http://www.cnblogs.com/zhenyulu/articles/48128.html