• 3.7 Proxy(代理)


    【返回目录】

    一家车床生产厂家的销售经理来到一家进出口贸易公司,他身后是400个民工抬着100台车床。销售经理找到进出口贸易公司的总经理谈买卖,希望通过他们公司的渠道来销售自己厂家的车床,所得利益双方分成。买卖没谈成,销售经理悻悻而归,那400个民工呼哧呼哧地跟在他后面把那100台车床再抬回去,场面相当壮观!

    上面的故事很难发生,原因很简单,那么笨的人很难当上销售经理。实际的情况应该是怎样呢?销售经理带上该厂所产车床的各种公开技术资料去和进出口贸易公司的总经理洽谈这笔业务,就算要表示诚意,顶多会找4个员工抬一台车床去现场验货,当双方洽谈结束,决定合作并签订协议之后,才会再找396个民工把其余的99台抬到贸易公司的仓库中(或者就留在本厂,将来直接发货给客户)。

    当我们使用计算机的时候,也会常常遇到类似的情况。当你打开一个图文并茂的Word文档的时候,细心观察你会发现一个现象,总是文字先出现,图片过一会儿才显示出来,当第一页的图片都显示出来之后,如果你翻到第二页,你会发现这个时候第二页的图片还没有显示,过一会儿才会显示。为什么会这样呢?很简单,这样的文档往往比较大,考虑到不是每位用户的计算机性能都很强劲,所以必须采取分批处理的方式而不是一次性把文档内容全部放到内存中之后再显示出来,那么用户往往会等上很久才能看到文档的内容,这不是一个好的用户体验,在等待的过程中,用户无事可做,他们甚至可能常常会认为这个时候电脑死机了。

    当我们需要一个机制来控制对象的创建和初始化的时候,我们就可以考虑采用代理模式:

       1: using System;
       2: using System.Threading;
       3:  
       4: namespace Autumoon.DesignPatterns.Proxy
       5: {
       6:     public abstract class CommonObject
       7:     {
       8:         abstract public void Request();
       9:     }
      10:  
      11:     public class ActualObject : CommonObject
      12:     {
      13:         public ActualObject()
      14:         {
      15:             Console.WriteLine("Starting to construct ActualObject");
      16:             Thread.Sleep(1000);
      17:             Console.WriteLine("Finished constructing ActualObject");
      18:         }
      19:  
      20:         override public void Request()
      21:         {
      22:             Console.WriteLine("Executing request in ActualObject");
      23:         }
      24:     }
      25:  
      26:     public class ProxyDemo : CommonObject
      27:     {
      28:         private ActualObject _actualSubject = null;
      29:  
      30:         override public void Request()
      31:         {
      32:             if (this._actualSubject == null)
      33:             {
      34:                 this._actualSubject = new ActualObject();
      35:             }
      36:  
      37:             this._actualSubject.Request();
      38:         }
      39:  
      40:     }
      41: }

    我们可以查看这段程序的运行效果来体会代理模式的用处:

       1: static void Main(string[] args)
       2: {
       3:     #region Proxy
       4:     new ProxyDemo().Request();
       5:     #endregion
       6:  
       7:     Console.ReadLine();
       8: }

    Proxy

  • 相关阅读:
    angularJS中的MVC思想?
    angularJs初体验,实现双向数据绑定!使用体会:比较爽
    原生JS去解析地址栏的链接?超好用的解决办法
    HDCMS多图字段的使用?
    sublime添加到鼠标右键打开文件的方法?
    Ajax做列表无限加载和Ajax做二级下拉选项
    Atitit.获取某个服务 网络邻居列表 解决方案
    Atitit. 注册表操作查询 修改 api与工具总结 java c# php js python 病毒木马的原理
    Atitit. 注册表操作查询 修改 api与工具总结 java c# php js python 病毒木马的原理
    Atitit.prototype-base class-based  基于“类” vs 基于“原型”
  • 原文地址:https://www.cnblogs.com/Autumoon/p/1076640.html
Copyright © 2020-2023  润新知