设计模式之代理模式

代理模式:

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

介绍

意图:为其他对象提供一种代理来控制对这个对象的访问。

使用场景:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象的创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问对象会给使用者或者系统结构带很多麻烦,我们可以在访问此对象时加上一个此对象的访问层。

如何使用:增加中间层。

关键代码:实现与被代理类组合。

应用实例:

  • 远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
  • 虚拟代理,是根据需要创建很大开销的对象,通过它来存放实例化需要很长时间的真实对象。
  • 安全代理,用来控制真实对象访问时的权限。
  • 智能引用,是指当调用真实的对象时,代理处理另外一些事。

优点:1.职责清晰;2.高扩展性;3。智能化。

缺点:1.由于在客户端和真实对象之间增加了代理对象,因此有些类型的代理模式可能会造成请求处理速度变慢;2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

实例

我们将创建一个Image接口和实现了Image接口的实体类,ProxyImage是一个代理类,减少RealImage对象加载的内存占用。代码如下:

 1 interface Image
 2     {
 3         void Display();
 4     }
 5 
 6     class RealImage : Image
 7     {
 8         private String m_fileName;
 9 
10         public RealImage(String fileName)
11         {
12             m_fileName = fileName;
13             LoadFormDisk(fileName);
14         }
15 
16         public void Display()
17         {
18             Console.WriteLine("Displaying"+m_fileName);
19         }
20 
21         private void LoadFormDisk(String fileName)
22         {
23             Console.WriteLine("Loading" + m_fileName);
24         }
25     }
26     class ProxyImage : Image
27     {
28         private RealImage m_realImage;
29         private String m_fileName;
30 
31         public ProxyImage(String fileName)
32         {
33             m_fileName = fileName;
34         }
35 
36         public void Display()
37         {
38             if (m_realImage == null)
39             {
40                 m_realImage = new RealImage(m_fileName);
41             }
42             m_realImage.Display();
43         }
44     }
45 
46 static void Main(string[] args)
47         {
48             Console.WriteLine("--------代理模式---------");
49             {
50                 Image image = new ProxyImage("testImage.jpg");
51                 image.Display();
52                 Console.WriteLine();
53                 image.Display();
54             }
55             Console.ReadLine();
56         }
原文地址:https://www.cnblogs.com/mohanchen/p/9588073.html