在软件设计中,代理是一个对象,充当客户端和另一个对象之间的中介。此中介可以在不更改对象代码的情况下向对象添加功能。代理模式在各种实际场景中都很普遍,从延迟加载对象到控制访问。
定义:代理模式为另一个对象提供代理项或占位符,以控制对它的访问。
public interface ISubject
{
void Request();
}
public class RealSubject : ISubject
{
public void Request()
{
Console.WriteLine("RealSubject: Handling Request.");
}
}
public class Proxy : ISubject
{
private RealSubject _realSubject;
public void Request()
{
if(_realSubject == null)
{
_realSubject = new RealSubject();
}
_realSubject.Request();
}
}
在创建对象在时间或资源方面成本高昂的情况下,代理可以延迟此创建,直到调用对象的方法。
public class LazyLoadedSubject : ISubject
{
private RealSubject _realSubject;
public void Request()
{
if(_realSubject == null)
{
Console.WriteLine("Initializing RealSubject...");
_realSubject = new RealSubject();
}
_realSubject.Request();
}
}
代理可以根据以下条件控制谁有权访问 RealSubject:
public class AccessControlProxy : ISubject
{
private RealSubject _realSubject;
private string _userRole;
public AccessControlProxy(string role)
{
_userRole = role;
}
public void Request()
{
if (_userRole == "Admin")
{
if(_realSubject == null)
{
_realSubject = new RealSubject();
}
_realSubject.Request();
}
else
{
Console.WriteLine("Access Denied.");
}
}
}
优点:
缺点:
代理模式提供了一种强大的方法来控制和管理对对象的访问。通过了解其不同的类型以及何时使用它们,开发人员可以在不更改核心对象逻辑的情况下为系统引入优化、控制机制和其他行为。如果使用得当,它可以产生干净、高效和可扩展的代码。