C# 代理模式

news/2024/9/23 10:17:29/

栏目总目录


概念

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

角色

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

  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#中,代理模式可以应用于多种场景,如远程调用、虚拟代理、保护代理等,提高了软件系统的灵活性和可扩展性。


http://www.ppmy.cn/news/1501227.html

相关文章

windows下实现mongodb备份还原

添加环境变量 把mongodb安装目录下的bin路径添加到环境变量的path路径: 备份库 打开CMD,执行以下命令: mongodump -u test -p test -d test -o D://backup_mongodb//20220706 –gzip 参数说明: -u 用户名 -p 密码 -d 需要备份的库名称…

FPGA开发——偶数分频器的设计

一、概述 1、我们在日常进行FPGA的开发之中,会根据需求的不同设计不同的功能实现,这就需要不同的分频信号,而分频的思想在我们的日常开发中显得尤为重要。用通俗易懂的说法表示分频就是对计数器进行一个进一步设计从而达到不同的分频器的思想…

景区AR导航营销系统:技术解决方案与实施效益分析

随着旅游市场的竞争日益激烈,景区需要不断创新以吸引游客。景区 AR 导航将虚拟画面与现实场景相结合,为游客提供了更加直观、生动的导航服务。对于景区而言,这一创新技术无疑是吸引游客目光、提升景区知名度的有力武器。通过独特的 AR 导航体…

【前端 11】初探DOM

JavaScript 对象 - DOM 初探 在Web开发中,DOM(Document Object Model,文档对象模型)是一个至关重要的概念。它不仅仅是一个API,更是Web页面与JavaScript代码之间的桥梁,允许开发者通过编程的方式动态地访问…

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一,后端接口开发Controller层修改接口接口测试 二,前端开发 这一节的内容是开发获取分类属性分组的接口。 一,后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…

HarmonyOS Next 省市区级联(三级联动)筛选框

效果图 完整代码 实例对象 export class ProvinceBean {id?: stringpid?: stringisSelect?: booleandeep?: objectextName?: stringchildren?: ProvinceBean[] }级联代码 import { MMKV } from tencent/mmkv/src/main/ets/utils/MMKV import { ProvinceBean } from ..…

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列,存在的问题:如果第一个消息延时时间很长,而第二个消息延时时间很短,第二个消息并不会优先得到执行。 下载插件 地址:https://github.com/rabbitmq/rabbitmq-delayed-message-excha…

【ffmpeg命令基础】视频选项讲解

文章目录 前言设置输出文件的帧数设置每秒播放的帧数设置输出视频的帧率示例1:更改输出视频的帧率示例2:将图像序列转换为视频 设置输入视频的帧率示例3:处理高帧率视频示例4:处理低帧率视频 同时设置输入和输出帧率示例5&#xf…