基本介绍:

  “代理”顾名思义指以他人的名义,在授权范围内进行处理事情的意思。

  在编程语言中的则解释为:为其他对象提供一种代理以控制对这个对象的访问。

  从释义上不难解读,代理本质就是一个中介,客户通过中介来访问原对象。本质就是在原对象基础上包了一层封装。

  那么问题来了,为什么不直接使用原对象,反而多此一举的创建这个第三者出来呢。下面就通过一些例子来具体说明。

举例说明:

  场景一:使用第三方登录时,比如QQ、微信登录,我们不可能直接引用第三方那边的任何源代码的东西,但可以通过封装第三方暴露出来的api才进行开发。

      在这个场景里,第三方的api就是原对象,我们做封装的类就是代理类。想要实现登录功能,就可以通过代理类来进行。这种网络通信中封装操作就是远程代理

  场景二:在日常开发中,同一个产品,可能对普通用户只开放一小部分功能,对VIP客户开放大部分功能,对管理者开放所有功能。

      针对不同权限有针对性的开放不同功能,那我们就可以在原对象基础上做封装来实现代理,封闭原对象所有功能。

      这个封装的代理类就可以控制这个对象的访问,可以给不同的用户提供不同级别的使用权限。这种有选择的开放就是保护代理

  场景三:大家在下载文件或者加载比较复杂的网站时,总会出现一个进度条或者加载loading,这个进度条或loading就使用的代理模式。

      这种使用消耗小,速度快的效果来替代表示的就是虚拟代理

  场景四:缓存Redis大家应该都使用过,它的作用就是把多终端频繁需要访问的数据从数据库临时存储在内存中共所有终端使用。这种就是缓冲代理

基本结构:

  代理模式其实没有什么固定的结构,如果是开发初期有计划的开发代理类,可以分为3个角色:

    1、抽象角色:它声明了真实对象和代理对象的共同接口,真实角色和代理角色继承自抽象角色。

    2、真实角色:继承自抽象角色,实现其真实的业务操作。

    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 }

总结:

  代理模式本质就是在客户端和目标对象之间添加中间件,通过这个中间件来有选择性的、有目的性的实现原目标对象中的功能。

  代理模式可以应用于网络通信、缓存处理、权限控制等多种场景。

  在日常编程中,代理其实无处不在。

  

c#中代理模式详解的更多相关文章

  1. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  2. 代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  3. 代理模式详解:静态代理、JDK动态代理与Cglib动态代理

    代理模式简介分类 概念 ​ 代理,是为了在不修改目标对象的基础上,增强目标方法的业务逻辑. ​ 客户类需要执行的是目标对象的目标方法,但是真正执行的是代理对象的代理方法,客户类对目标对象的访问是通过代 ...

  4. 深入浅出的webpack构建工具---devTool中SourceMap模式详解(四)

    阅读目录 一:什么是SourceMap? 二:理解webpack中的SourceMap的eval,inline,sourceMap,cheap,module 三:开发环境和线上环境如何选择source ...

  5. HTTP协议头部与Keep-Alive模式详解

    HTTP协议头部与Keep-Alive模式详解 .什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器 ...

  6. WCF中队列服务详解

    WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...

  7. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  8. HTTP协议Keep-Alive模式详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp22 HTTP协议Keep-Alive模式详解 1.什么是Keep-Aliv ...

  9. IOS中UITableViewCell使用详解

    IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(N ...

  10. 【转】java的动态代理机制详解

    java的动态代理机制详解   在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们 ...

随机推荐

  1. 服务器衡量标准--RASUM

    对于一台服务器来讲,服务器的性能设计目标是如何平衡各部分的性能,使整个系统的性能达到最优.如果一台服务器有每秒处理1000个服务请求的能力,但网卡只能接受200个请求,而硬盘只能负担150个,而各种总 ...

  2. vue结合cesium,配置,插件vue-cli-plugin-cesium

    https://www.npmjs.com/package/vue-cli-plugin-cesium

  3. 应用层协议之DNS、DHCP

    运输层为应用进程提供了端对端的通信服务,但不同的网络应用的应用进程之间,还需要有不同的通信规则.因此在运输层协议之上,还需要有应用层协议. 应用层中有这些常见的协议 域名系统:DNS 动态主机配置:D ...

  4. 基于consul实现docker跨主机网络通信

    前言 IP: 192.168.0.10 192.168.0.11 系统版本:ubuntu 20.04 consul版本:1.11.1 官网下载地址: https://www.consul.io/dow ...

  5. [ansible]简介安装入门

    简介 ansible是一种运维自动化工具,默认通过ssh协议管理机器.只需要在一台机器上安装好,就可以通过这台电脑管理一组远程的机器.而被管理的linux机器只要有python环境,就不需要额外安装a ...

  6. 通过python,将excel中的数据写入二维列表

    需求:读取Excel表中数据,每行数据放在一个列表中,再把所有列表都存入到一个列表中,形成二维列表. 实现方法:导入可在Python处理Excel表格数据的模块. excel表: 方法一:xlwing ...

  7. Python 基础面试第二弹

    1. 解释下Python中的面向对象,以及面向对象的三大特点: 在Python中,面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的 ...

  8. css面试题一

    1.继承 css的继承:就是给父级设置一些属性,子级继承了父级的该属性,这就是我们css中的继承.官方的解释,继承是一种规则,它允许样式不仅应用于特定的html标签元素,而且应用于其后代元素. a.有 ...

  9. 推荐vue脚手架工具 vue-cli

    安装vue-cli之前,需要先装好vue 和 webpack npm install -g vue //全局安装vue npm install -g webpack //全局安装webpack npm ...

  10. MySQL实战实战系列 07 行锁功过:怎么减少行锁对性能的影响?

    在上一篇文章中,我跟你介绍了 MySQL 的全局锁和表级锁,今天我们就来讲讲 MySQL 的行锁. MySQL 的行锁是在引擎层由各个引擎自己实现的.但并不是所有的引擎都支持行锁,比如 MyISAM ...