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: }
转载请注明出处。版权所有©2022 麦机长,保留所有权利。