c#中代理模式详解
基本介绍:
“代理”顾名思义指以他人的名义,在授权范围内进行处理事情的意思。
在编程语言中的则解释为:为其他对象提供一种代理以控制对这个对象的访问。
从释义上不难解读,代理本质就是一个中介,客户通过中介来访问原对象。本质就是在原对象基础上包了一层封装。
那么问题来了,为什么不直接使用原对象,反而多此一举的创建这个第三者出来呢。下面就通过一些例子来具体说明。
举例说明:
场景一:使用第三方登录时,比如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 }
总结:
代理模式本质就是在客户端和目标对象之间添加中间件,通过这个中间件来有选择性的、有目的性的实现原目标对象中的功能。
代理模式可以应用于网络通信、缓存处理、权限控制等多种场景。
在日常编程中,代理其实无处不在。
c#中代理模式详解的更多相关文章
- Docker Kubernetes Service 网络服务代理模式详解
Docker Kubernetes Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...
- 代理模式详解:静态代理+JDK/CGLIB 动态代理实战
1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...
- 代理模式详解:静态代理、JDK动态代理与Cglib动态代理
代理模式简介分类 概念 代理,是为了在不修改目标对象的基础上,增强目标方法的业务逻辑. 客户类需要执行的是目标对象的目标方法,但是真正执行的是代理对象的代理方法,客户类对目标对象的访问是通过代 ...
- 深入浅出的webpack构建工具---devTool中SourceMap模式详解(四)
阅读目录 一:什么是SourceMap? 二:理解webpack中的SourceMap的eval,inline,sourceMap,cheap,module 三:开发环境和线上环境如何选择source ...
- HTTP协议头部与Keep-Alive模式详解
HTTP协议头部与Keep-Alive模式详解 .什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器 ...
- WCF中队列服务详解
WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- HTTP协议Keep-Alive模式详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp22 HTTP协议Keep-Alive模式详解 1.什么是Keep-Aliv ...
- IOS中UITableViewCell使用详解
IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(N ...
- 【转】java的动态代理机制详解
java的动态代理机制详解 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们 ...
随机推荐
- HTML超文本标记语言1
一.简介-HTML 1.什么是HTML?? 首先,HTML是WWW的描述语言,由Tim Berners-lee提出. HTML是用于描述网页的一种语言 html是指超文本标记语言(HyperText ...
- Python和PyTorch深入实现线性回归模型:一篇文章全面掌握基础机器学习技术
1. 简介 1.1 线性回归模型概述 线性回归是一种统计学中的预测分析,该方法用于建立两种或两种以上变量间的关系模型.线性回归使用最佳的拟合直线(也称为回归线)在独立(输入)变量和因变量(输出)之间建 ...
- [selenium]点击元素出现的obscure问题
前言 我们一般使用如下方式点击元素: elem = driver.find_element(...) elem.click() # 或者使用带等待条件的方式 elem = WebDriverWait( ...
- selenium + python自动化环境搭建
Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firef ...
- ENVI+ERDAS实现Hyperion叶绿素含量反演:经验比值法、一阶微分法
本文介绍基于ENVI与ERDAS软件,依据Hyperion高光谱遥感影像,采用经验比值法.一阶微分法等,对叶绿素含量等地表参数加以反演的具体操作. 目录 1 前期准备与本文理论部分 1.1 几句闲谈 ...
- 获取API接口返回的商品详情数据后该如何使用
获取API接口返回的商品详情数据后,我们可以使用以下方式将其处理和利用: 数据展示:我们可以将API接口返回的商品详情数据以列表.表格.图形等形式展示给用户,以便他们更好地了解商品的基本信息.特征.评 ...
- 学习JavaScript的路径
学习JavaScript的路径可以按照以下步骤进行: 了解基本概念:首先学习JavaScript的基本概念,包括变量.数据类型.运算符.数组.对象.循环和条件语句等.可以通过阅读相关的教材.在线课程或 ...
- 1.15 自实现GetProcAddress
在正常情况下,要想使用GetProcAddress函数,需要首先调用LoadLibraryA函数获取到kernel32.dll动态链接库的内存地址,接着在调用GetProcAddress函数时传入模块 ...
- Python 搭建 FastAPI 项目
一般网上的文章都是以脚本的方式写Demor的,没找到自己想要的那种项目结构型的示例(类似Java SpringBoot 创建 Model,通过 pom 进行关联配置的那种) 看了一些源码,再结合自己的 ...
- Vue vs React:你需要知道的一切
Vue 和 React 是创建 JavaScript 网络应用程序最常用的两种工具.但我们该如何在两者之间做出选择呢?在本篇 Vue 与 React 的对比中,我们将尝试找出答案.我们将回顾每种工具的 ...