老生常谈:代理模式

      在上一篇你会在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

 

    

原文地址:https://www.cnblogs.com/ASPNET2008/p/1292112.html