定义:代理模式(ProxyPattern),为其他对象提供一种代理以控制对这个对象的访问。
类型:结构型模式
分类:
- 远程代理,为一个对象在不同的地址空间提供局部代表。
- 虚代理,根据需要创建开销很大的对象。
- 保护代理,控制对原始对象的访问。
- 智能指引,取代简单指针,在访问时执行一些附加操作。
概述:
- 远程代理,如代理商,什么区域代、省代之类的都算是远程代理。代理商在某一局部代表厂商。
- 虚代理,主要是为了解决一次开销过大的情况,例如打开大的文件之类的。
- 保护代理,律师就是代理委托人行使其保护其权利,正好是保护代理。
- 智能指针,智能指针,画图双缓存等都算是智能指引了,主要是复用对象的某些特性自动完成某些工作,如构造函数、析构函数之类的。
无论是哪一种代理,都是一个代理对象来代理完成被代理的工作,当然这期间代理对象会添加一些功能使得客户更方便地操作。为了让客户操作代理对象像操作原对象一样方便,代理类一般会保持和原对象相同的接口。上面四种代理模式,只是一些经常被用到的代理功能。实际的使用中,并不一定需要拘泥于这四种代理模式。一切为了让用户更方便更快捷地操作对象而产生的中间类都算是代理模式的运用。代理模式其实很简单,就是一个代理类对另一个类的再封装,以便更好的让客户调用。
类图:
参与者:
- Client,客户端提供交互。
- Subject,提供接口。
- RealSubject,完成接口,是真正需要被代理的类。
- Proxy,有一个Subject的指针,指向RealSubject。调用RealSubject.DoSomething()实现DoSomething接口,并扩展一些功能。
示例代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace Design13 6 { 7 // 主要是提供接口 8 abstract class Subject 9 { 10 public abstract void DoSomething(); 11 } 12 13 // 具体的对象 14 class RealSubject : Subject 15 { 16 public override void DoSomething() 17 { 18 Console.WriteLine("做一些事"); 19 } 20 } 21 22 // 代理类,和具体的对象实现的是相同的接口 23 class Proxy : Subject 24 { 25 private Subject realSubject; 26 public Proxy() 27 { 28 realSubject = new RealSubject(); 29 } 30 public override void DoSomething() 31 { 32 if (realSubject != null) 33 { 34 realSubject.DoSomething(); 35 Console.WriteLine("再做一些其他事"); 36 } 37 } 38 } 39 40 // Client 41 class Program 42 { 43 static void Main(string[] args) 44 { 45 Proxy proxy = new Proxy(); 46 proxy.DoSomething(); 47 } 48 } 49 }
注意:如果是C++,抽象类一定要注意析构函数一定要是虚函数。
与其他模式比较:代理模式与装饰者模式有一定的类似度。但是两者目的不一样,代理模式是为了让客户更方便地访问。而装饰者模式侧重于添加新的功能。
优缺点:
- 优点,减少内存的使用。
- 缺点,加大了结构的复杂度,需要单独管理外部状态。
参考资料:
- 《设计模式——可复用面向对象软件基础》
- 《大话设计模式》
- 《Head First设计模式》