当前位置: 首页 > news >正文

C# 代理模式

栏目总目录


概念

代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在代理模式中,我们创建一个具有现有对象(称为“真实对象”或“被代理对象”)相同功能的代理对象。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象间接地访问目标对象。这种方式可以增加额外的功能处理,例如权限校验、日志记录、事务处理等。

角色

在代理模式中,通常包含以下几个角色:

  1. Subject(抽象主题角色):定义了真实对象和代理对象的共同接口,这样在任何使用真实对象的地方都可以使用代理对象。
  2. RealSubject(真实主题角色):定义了代理所代表的真实对象,它实现了Subject接口,是代理对象所代表的真实实体。
  3. Proxy(代理角色):持有对真实对象的引用,从而可以在任何时候操作真实对象。代理对象在客户端和目标对象之间起到中介的作用,并且可以通过代理对象间接地访问目标对象。

好处

  1. 功能增强:可以在不修改原有系统代码的情况下,通过代理类增加新的功能。
  2. 权限控制:通过代理类控制对真实对象的访问权限,实现不同用户访问同一对象的不同权限。
  3. 日志记录:通过代理类可以对真实对象的方法调用进行日志记录,方便问题追踪和系统监控。
  4. 远程代理:可以将网络上的远程对象作为本地对象来访问,隐藏了远程调用的细节。

应用场景

  1. 远程代理:为远程对象提供一个本地的代理对象,隐藏远程调用的复杂性。
  2. 虚拟代理:根据需要动态地创建开销大的对象,如图片加载、视频流等。
  3. 保护代理:控制对原始对象的访问,防止非授权访问。
  4. 智能引用代理:当对象被访问时,增加一些额外的操作,如计数、懒加载等。

示例代码

以下是一个简单的 C# 代理模式实现示例,演示了虚拟代理的应用场景:

using System;// 抽象主题角色
public interface IImage
{void Display();
}// 真实主题角色
public class RealImage : IImage
{private string filename;public RealImage(string filename){this.filename = filename;LoadFromDisk(filename);}private void LoadFromDisk(string filename){Console.WriteLine($"Loading {filename}");// 这里模拟加载图片的过程,实际开发中可能是复杂的文件读取和网络请求System.Threading.Thread.Sleep(1000); // 模拟耗时操作Console.WriteLine($"{filename} loaded");}public void Display(){Console.WriteLine($"Displaying {filename}");}
}// 代理角色
public class ProxyImage : IImage
{private RealImage realImage;private string filename;private bool isLoaded = false;public ProxyImage(string filename){this.filename = filename;}public void Display(){if (!isLoaded){realImage = new RealImage(filename);isLoaded = true;}realImage.Display();}
}// 客户端代码
class Program
{static void Main(string[] args){IImage image = new ProxyImage("test.jpg");// 假设在此时,我们不需要立即加载图片,只是占个位置// 稍后,当真正需要显示图片时image.Display(); // 此时才会真正加载图片Console.ReadLine();}
}

总结

代理模式是一种非常有用的设计模式,它通过引入代理对象来控制对真实对象的访问,从而实现功能增强、权限控制、日志记录等目的。在C#中,代理模式可以应用于多种场景,如远程调用、虚拟代理、保护代理等,提高了软件系统的灵活性和可扩展性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 半导体行业黑话-02
  • 【Qt】文字换行
  • 【Zoom 】超全!!!Zoom收藏这一篇足矣!!Zoom视频会议软件:全面解析与高效使用指南 (全文近1W字)
  • 无人机10公里WiFi图传摄像模组,飞睿智能超清远距离无线监控,智能安防新潮流
  • 《python程序语言设计》第6章15题财务应用程序:打印税款表。利用程序清单4-7的代码
  • 安宝特方案|解放双手,解决死角,AR带来质量监督新体验
  • Spring Boot:图书管理系统(一)
  • 已解决:vue-office/excel 多个sheet点击切换,滚动条高度不重置,表格视图位置不正确
  • 文件包含漏洞--pyload
  • 生物学家做不出 AlphaGO,但也在创造生命……
  • 学习笔记-系统框图传递函数公式推导
  • pinia安装及简介
  • AI学习记录 -使用react开发一个网页,对接chatgpt接口,附带一些英语的学习prompt
  • 在vue中优雅地异步引入(懒加载)腾讯地图API
  • tinyxml2的入门教程
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 《Java编程思想》读书笔记-对象导论
  • 2017-09-12 前端日报
  • 2019.2.20 c++ 知识梳理
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Making An Indicator With Pure CSS
  • Nodejs和JavaWeb协助开发
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Redis字符串类型内部编码剖析
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring Boot快速入门(一):Hello Spring Boot
  • text-decoration与color属性
  • Vue组件定义
  • 前嗅ForeSpider教程:创建模板
  • 少走弯路,给Java 1~5 年程序员的建议
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我从编程教室毕业
  • 延迟脚本的方式
  • 译米田引理
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​VRRP 虚拟路由冗余协议(华为)
  • ‌JavaScript 数据类型转换
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #android不同版本废弃api,新api。
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (6)添加vue-cookie
  • (7)STL算法之交换赋值
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (分类)KNN算法- 参数调优
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (论文阅读40-45)图像描述1
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • .net core Redis 使用有序集合实现延迟队列
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】