zoukankan      html  css  js  c++  java
  • 老生常谈:代理模式

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

     

        

  • 相关阅读:
    迭代模型
    螺旋模型
    瀑布模型
    V模型
    codeforces411div.2
    专题1:记忆化搜索/DAG问题/基础动态规划
    Python
    字符串的相关操作方法
    Python基本数据类型
    编码
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/1292112.html
Copyright © 2011-2022 走看看