设计模式(12)代理模式

模式介绍

代理模式提供代理或占位符对象来控制对另一个不同对象的访问。代理对象可以以与包含对象的方式相同的方式使用。

示例

我们再次以高端餐馆的服务员来建模,服务员需要做三件事情:

  1. 取单
  2. 下单
  3. 结账

抽象的服务员接口:

/// <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/

原文地址:https://www.cnblogs.com/talentzemin/p/9883726.html