模式介绍
代理模式提供代理或占位符对象来控制对另一个不同对象的访问。代理对象可以以与包含对象的方式相同的方式使用。
示例
我们再次以高端餐馆的服务员来建模,服务员需要做三件事情:
- 取单
- 下单
- 结账
抽象的服务员接口:
/// <summary>
/// The Subject interface which both the RealSubject and proxy will need to implement
/// </summary>
public interface IServer
{
void TakeOrder(string order);
string DeliverOrder();
void ProcessPayment(string payment);
}
服务员类:
/// <summary>
/// The RealSubject class which the Proxy can stand in for
/// </summary>
class Server : IServer
{
private string Order;
public void TakeOrder(string order)
{
Console.WriteLine("Server takes order for " + order + ".");
Order = order;
}
public string DeliverOrder()
{
return Order;
}
public void ProcessPayment(string payment)
{
Console.WriteLine("Payment for order (" + payment + ") processed.");
}
}
现在想象一下,我们的服务员实例是一个有经验的服务员,它正在培训一个新服务员。
从顾客的角度来看,这名新员工仍然是一个服务员,并且仍将如此行事。然而,新服务员无法处理付款,因为他必须首先学习订单处理。
我们可以创建一个代理来对这个新员工建模。代理需要维护引用到服务员实例,以便它可以调用Server实例的PraseSpayMeMess()方法:
/// <summary>
/// The Proxy class, which can substitute for the Real Subject.
/// </summary>
class NewServerProxy : IServer
{
private string Order;
private Server _server = new Server();
public void TakeOrder(string order)
{
Console.WriteLine("New trainee server takes order for " + order + ".");
Order = order;
}
public string DeliverOrder()
{
return Order;
}
public void ProcessPayment(string payment)
{
Console.WriteLine("New trainee cannot process payments yet!")
_server.ProcessPayment(payment);
}
}
总结
代理模式试图创建一个“备用”对象,该对象可以用来代替现有对象,并维护对所述现有对象的实例的引用。
为了实现该模式,代理对象必须能够在被替换对象可以使用的任何地方使用。
源代码
https://github.com/exceptionnotfound/DesignPatterns/tree/master/Proxy
原文
https://www.exceptionnotfound.net/proxy-the-daily-design-pattern/