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

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.dtcms.com/a/358246.html

相关文章:

  • spark.sparkContext.broadcast() 与 org.apache.spark.sql.functions.broadcast 的区别
  • 开源PPT生成智能体(Agent)全景透视:技术路线、代表项目与未来趋势
  • 鸿蒙ArkTS 核心篇-15-条件渲染(组件)
  • 三重积分的性质
  • [论文阅读] 人工智能 + 软件工程 | 从“法律条文”到“Gherkin脚本”:Claude与Llama谁更懂合规开发?
  • comfUI背后的技术——VAE
  • [创业之路-581]:如何驾驭不确定性和风险,并从中获利?
  • 什么是雪花算法
  • [Mysql数据库] 知识点总结7
  • 直播间整蛊玩法
  • 【一】Django框架版本介绍
  • 2025 批量下载hasmart所有知乎回答,文章和想法,导出txt,html和pdf
  • OSI与TCP/IP各层功能详解
  • 计算机毕设javayit商城 基于SSM框架的校园二手交易全流程管理系统设计与实现 Java+MySQL的校园二手商品交易与供需对接平台开发
  • java字节码增强,安全问题?
  • python pyqt5开发DoIP上位机【介绍】
  • 【Big Data】AI赋能的ClickHouse 2.0:从JIT编译到LLM查询优化,下一代OLAP引擎进化路径
  • 【具身智能】【机械臂】机械臂轨迹规划项目以及资料汇总【持续更新】
  • PLC中的指令:LDP,ANDP,ORP这几个英文全称是什么
  • Pmp项目管理方法介绍|权威详解与实战指南
  • 【Python】国内可用的高速pip镜像源大全
  • 虚幻基础:角色动画
  • 网络初识及网络编程
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(七)
  • 构建坚不可摧的数据堡垒:深入解析 Oracle 高可用与容灾技术体系
  • 【物联网】bleak (scan)扫描在干什么? BLE 广播(Advertising)
  • 【Zephyr炸裂知识系列】11_手撸内存泄露监测算法
  • HoloLens2是如何扫描周边环境生成三角面片的,跟周边光线强弱关系
  • 基于单片机甲醛浓度检测报警系统Proteus仿真(含全部资料)
  • 深入理解C++中的返回值优化与流插入操作符