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