设计模式 - 代理模式
1.设计模式 - 工厂模式2.设计模式 - 抽象工厂模式3.设计模式 - 单例模式4.设计模式 - 建造者模式5.设计模式 - 原型模式6.设计模式 - 适配器模式7.设计模式 - 桥接模式8.设计模式 - 组合模式9.设计模式 - 装饰模式10.设计模式 - 外观模式11.设计模式 - 享元模式
12.设计模式 - 代理模式
13.设计模式 - 责任链模式14.设计模式 - 命令模式15.设计模式 - 解释器模式16.设计模式 - 迭代器模式17.设计模式 - 中介者模式18.设计模式 - 备忘录模式19.设计模式 - 观察者模式20.设计模式 - 状态模式21.设计模式 - 策略模式22.设计模式 - 模板方法模式23.设计模式 - 访问者模式24.设计模式合集概述
代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式通过引入一个代理对象来控制对原对象的访问,可以在不改变原对象的情况下扩展其功能。代理模式常用于延迟加载、访问控制、日志记录等场景。
结构
代理模式包含以下几个角色:
- 抽象主题(Subject):定义了代理类和真实类的公共接口。
- 真实主题(RealSubject):实现了抽象主题接口,表示代理所代表的真实对象。
- 代理(Proxy):实现了抽象主题接口,包含对真实主题对象的引用,并可以控制对真实主题的访问。
示例代码
假设我们有一个应用程序需要通过代理对象来控制对某个服务的访问,例如远程服务的访问控制。
代码地址
抽象主题
public interface IService
{
void Request();
}
真实主题
public class RealService : IService
{
public void Request()
{
Console.WriteLine("RealService: Handling request.");
}
}
代理
public class ServiceProxy : IService
{
private RealService _realService;
private bool _isAuthorized;
public ServiceProxy(bool isAuthorized)
{
_realService = new RealService();
_isAuthorized = isAuthorized;
}
public void Request()
{
if (_isAuthorized)
{
Console.WriteLine("ServiceProxy: Authorizing request.");
_realService.Request();
}
else
{
Console.WriteLine("ServiceProxy: Unauthorized request.");
}
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
IService authorizedProxy = new ServiceProxy(true);
authorizedProxy.Request();
IService unauthorizedProxy = new ServiceProxy(false);
unauthorizedProxy.Request();
}
}
应用场景
代理模式适用于以下场景:
- 远程代理:为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
- 保护代理:控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
- 智能指引:取代了简单的指针,它在访问对象时执行一些附加操作。
优缺点
优点
- 控制对象访问:代理模式可以控制对真实对象的访问,增加了系统的安全性和灵活性。
- 延迟加载:代理模式可以实现延迟加载,优化系统性能。
- 日志记录:代理模式可以在访问真实对象时进行日志记录,便于调试和监控。
缺点
- 增加系统复杂性:引入代理对象会增加系统的复杂性,特别是当代理层次过多时。
- 性能开销:代理模式可能会增加一些额外的调用开销,影响系统性能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库