代理模式:
在代理模式(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 }