zoukankan      html  css  js  c++  java
  • 设计模式(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/

  • 相关阅读:
    assign、weak
    iOS 使用 github
    iOS 知识点
    thinkphp 具体常量,在view里面使用
    一个php+jquery+json+ajax实例
    php pdo操作
    nginx缓存
    php模版静态化技术
    php模版静态化原理
    thinkphp实现多数据库操作
  • 原文地址:https://www.cnblogs.com/talentzemin/p/9883726.html
Copyright © 2011-2022 走看看