基本介绍:
"代理"顾名思义指以他人的名义,在授权范围内进行处理事情的意思。
在编程语言中的则解释为:为其他对象提供一种代理以控制对这个对象的访问。
从释义上不难解读,代理本质就是一个中介,客户通过中介来访问原对象。本质就是在原对象基础上包了一层封装。
那么问题来了,为什么不直接使用原对象,反而多此一举的创建这个第三者出来呢。下面就通过一些例子来具体说明。
举例说明:
场景一:使用第三方登录时,比如QQ、微信登录,我们不可能直接引用第三方那边的任何源代码的东西,但可以通过封装第三方暴露出来的api才进行开发。
在这个场景里,第三方的api就是原对象,我们做封装的类就是代理类。想要实现登录功能,就可以通过代理类来进行。这种网络通信中封装操作就是远程代理。
场景二:在日常开发中,同一个产品,可能对普通用户只开放一小部分功能,对VIP客户开放大部分功能,对管理者开放所有功能。
针对不同权限有针对性的开放不同功能,那我们就可以在原对象基础上做封装来实现代理,封闭原对象所有功能。
这个封装的代理类就可以控制这个对象的访问,可以给不同的用户提供不同级别的使用权限。这种有选择的开放就是保护代理。
场景三:大家在下载文件或者加载比较复杂的网站时,总会出现一个进度条或者加载loading,这个进度条或loading就使用的代理模式。
这种使用消耗小,速度快的效果来替代表示的就是虚拟代理 。
场景四:缓存Redis大家应该都使用过,它的作用就是把多终端频繁需要访问的数据从数据库临时存储在内存中共所有终端使用。这种就是缓冲代理。
基本结构:
代理模式其实没有什么固定的结构,如果是开发初期有计划的开发代理类,可以分为3个角色:
1、抽象角色:它声明了真实对象和代理对象的共同接口,真实角色和代理角色继承自抽象角色。
2、真实角色:继承自抽象角色,实现其真实的业务操作。
3、代理角色:继承自抽象角色,在角色内部创建真实角色的实例,对其内函数进行加工封装操作,以供客户端使用。
在日常开发中,使用最多的只是简单的创建一个代理类,在代理类内部对真实角色进行封装而已。
优缺点:
- 代理模式能够将真正被调用的对象隔离,在一定程度上降低了系统的耦合度;
- 代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。
- 代理对象可以在对目标对象发出请求之前进行一个额外的操作,例如权限检查等。
具体实例:
1 /// <summary>
2 /// 接口类
3 /// </summary>
4 public interface IImage
5 {
6 void Display();
7 }
8
9 /// <summary>
10 /// 真实对象
11 /// </summary>
12 public class RealImage : IImage
13 {
14 private string filename;
15
16 public RealImage(string filename)
17 {
18 this.filename = filename;
19 LoadFromDisk();
20 }
21
22 private void LoadFromDisk()
23 {
24 Console.WriteLine("Loading " + filename);
25 }
26
27 public void Display()
28 {
29 Console.WriteLine("Displaying " + filename);
30 }
31 }
32
33 /// <summary>
34 /// 代理类
35 /// </summary>
36 public class ProxyImage : IImage
37 {
38 //真实对象实例
39 private RealImage realImage;
40 private string filename;
41
42 public ProxyImage(string filename)
43 {
44 this.filename = filename;
45 }
46
47 public void Display()
48 {
49 if (realImage == null)
50 {
51 realImage = new RealImage(filename);
52 }
53 realImage.Display();
54 }
55 }
56
57 /// <summary>
58 /// 客户端
59 /// </summary>
60 class Client
61 {
62 static void Main(string[] args)
63 {
64 IImage image = new ProxyImage("图1");
65 image.Display();
66 Console.ReadKey();
67 }
68 }
总结:
代理模式本质就是在客户端和目标对象之间添加中间件,通过这个中间件来有选择性的、有目的性的实现原目标对象中的功能。
代理模式可以应用于网络通信、缓存处理、权限控制等多种场景。
在日常编程中,代理其实无处不在。