概述
代理模式(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();
}
}
应用场景
代理模式适用于以下场景:
- 远程代理:为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
- 保护代理:控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
- 智能指引:取代了简单的指针,它在访问对象时执行一些附加操作。
优缺点
优点
- 控制对象访问:代理模式可以控制对真实对象的访问,增加了系统的安全性和灵活性。
- 延迟加载:代理模式可以实现延迟加载,优化系统性能。
- 日志记录:代理模式可以在访问真实对象时进行日志记录,便于调试和监控。
缺点
- 增加系统复杂性:引入代理对象会增加系统的复杂性,特别是当代理层次过多时。
- 性能开销:代理模式可能会增加一些额外的调用开销,影响系统性能。