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

98、23种设计模式之代理模式(7/23)

代理模式 (Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。

一、代理模式的形式

1.远程代理:为远程对象提供本地代表
2.虚拟代理:根据需要创建开销很大的对象
3.保护代理:控制对原始对象的访问权限
4.智能引用代理:在访问对象时执行附加操作

二、基本实现示例

1. 接口定义

// 主题接口
public interface ISubject
{void Request();
}

2. 真实主题类

// 真实主题类
public class RealSubject : ISubject
{public void Request(){Console.WriteLine("RealSubject: 处理请求");}
}

3. 代理类

// 代理类
public class Proxy : ISubject
{private RealSubject _realSubject;public void Request(){// 在调用真实对象方法前后可以添加额外逻辑if (_realSubject ==){_realSubject = new RealSubject();}Console.WriteLine("Proxy: 在调用真实对象前");_realSubject.Request();Console.WriteLine("Proxy: 在调用真实对象后");}
}

4. 客户端使用

class Program
{static void Main(string[] args){Proxy proxy = new Proxy();proxy.Request();}
}

三、实际应用示例

1、虚拟代理示例 - 图片加载代理

// 图片接口
public interface IImage
{void Display();
}// 真实图片类(加载可能很耗时)
public class RealImage : IImage
{private string _filename;public RealImage(string filename){_filename = filename;LoadFromDisk();}private void LoadFromDisk(){Console.WriteLine($"加载图片: {_filename}");// 模拟耗时操作Thread.Sleep(2000);}public void Display(){Console.WriteLine($"显示图片: {_filename}");}
}// 图片代理(虚拟代理)
public class ImageProxy : IImage
{private string _filename;private RealImage _realImage;public ImageProxy(string filename){_filename = filename;}public void Display(){if (_realImage ==){_realImage = new RealImage(_filename);}_realImage.Display();}
}// 使用
class Program
{static void Main(){IImage image = new ImageProxy("test.jpg");// 第一次调用会实际加载图片Console.WriteLine("第一次调用:");image.Display();// 第二次调用直接使用已加载的图片Console.WriteLine("\n第二次调用:");image.Display();}
}

2.保护代理示例 - 权限控制

// 文档接口
public interface IDocument
{void Display();void Edit();
}// 真实文档
public class RealDocument : IDocument
{private string _content;public RealDocument(string content){_content = content;}public void Display(){Console.WriteLine($"显示文档内容: {_content}");}public void Edit(){Console.WriteLine("编辑文档...");}
}// 文档代理(保护代理)
public class DocumentProxy : IDocument
{private RealDocument _document;private string _userRole;public DocumentProxy(string content, string userRole){_document = new RealDocument(content);_userRole = userRole;}public void Display(){_document.Display();}public void Edit(){if (_userRole == "Admin"){_document.Edit();}else{Console.WriteLine("无权限编辑文档");}}
}// 使用
class Program
{static void Main(){IDocument adminDoc = new DocumentProxy("机密文件", "Admin");IDocument userDoc = new DocumentProxy("普通文件", "User");Console.WriteLine("管理员尝试:");adminDoc.Display();adminDoc.Edit();Console.WriteLine("\n普通用户尝试:");userDoc.Display();userDoc.Edit();}
}

四、.NET 中的代理模式应用

  • WCF 服务代理:自动生成的客户端代理类
  • EF Core 延迟加载:通过代理实现延迟加载
  • 装饰器模式:常与代理模式结合使用
  • AOP 框架:如 Castle DynamicProxy

代理模式在需要控制资源访问、延迟加载或添加额外行为时非常有用,同时保持客户端代码的简洁性。

在这里插入图片描述

http://www.xdnf.cn/news/19373.html

相关文章:

  • 【SpringMVC】SSM框架【二】——SpringMVC超详细
  • ModuleNotFoundError: No module named ‘cairosvg‘
  • 浔川社团阅读量破历史记录
  • 得物25年春招-安卓部分编程题
  • GD32入门到实战21--输入捕获
  • 【C++】日期类实现详解:代码解析与复用优化
  • C#正则表达式与用法
  • 【基础-单选】关于Tabs组件页签的位置设置,下面描述错误的是
  • 免费在线图片合成视频工具 ,完全免费
  • uni.onBLECharacteristicValueChange接收到数据,返回的value为{}的原因及其获取方法
  • 佳易王钟表维修养护管理系统:开启钟表维修高效管理新篇章​就#软件操作教程
  • Mysql 学习day 2 深入理解Mysql索引底层数据结构
  • React前端开发_Day6-Day9_极客园项目
  • C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region
  • Spring AI 的应用和开发
  • 如何简单建设一个网站,让用户快速找到你。
  • 在PowerPoint和WPS演示让蝴蝶一直跳8字舞
  • Python生成免安装exe
  • SAP PP模块的MPS
  • Vue加载速度优化,verder.js和element.js加载速度慢解决方法
  • 防火墙技术(二):安全区域
  • C#调用c++ dll读取2进制文件时而正常,时而异常
  • 语义分割目前还是研究热点吗?
  • 如何快速了解项目管理基础
  • 【具身智能】【机械臂】机械臂轨迹规划项目以及资料汇总【持续更新】
  • 【物联网】MQTT / Broker / Topic 是什么?
  • windows 谷歌浏览器把英文改成中文
  • 【路由器】TP Link 路由器为何无法进入管理后台
  • 关于铭飞平台企业官网模板使用中常到的问题、企业官网的百度认证以及IDEA编辑启动器的快捷方法/Apipost本地和云端没法同步的问题解决
  • 【软考架构】SOA与微服务解疑