zoukankan      html  css  js  c++  java
  • PHP设计模式——代理模式

    声明:本系列博客参考资料《大话设计模式》,作者程杰。

            代理模式为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

            UML类图:

             

           角色介绍:     

           抽象主题角色(IGiveGift):定义了Follower和Proxy公用接口,这样就在任何使用Follower的地方都可以使用Proxy。

           主题角色(Follower):定义了Proxy所代表的真实实体。

           代理对象(Proxy):保存一个引用使得代理可以访问实体,并提供一个与Follower接口相同的接口,这样代理可以用来代替实体(Follower)。

          代码实现:

          

    1. <?php  
    2. /** 
    3.  * Created by PhpStorm. 
    4.  * User: LYL 
    5.  * Date: 2015/5/16 
    6.  * Time: 16:33 
    7.  */  
    8.   
    9. /**顶层接口 
    10.  * Interface IGiveGift 
    11.  */  
    12. interface IGiveGift  
    13. {  
    14.     function giveRose();  
    15.     function giveChocolate();  
    16. }  
    17.   
    18. /**追求者 
    19.  * Class Follower 
    20.  */  
    21. class Follower implements IGiveGift  
    22. {  
    23.     private $girlName;  
    24.   
    25.     function __construct($name='Girl')  
    26.     {  
    27.         $this->girlName=$name;  
    28.     }  
    29.   
    30.     function giveRose()  
    31.     {  
    32.         echo "{$this->girlName}:这是我送你的玫瑰,望你能喜欢。<br/>";  
    33.     }  
    34.   
    35.     function giveChocolate()  
    36.     {  
    37.         echo "{$this->girlName}:这是我送你的巧克力,望你能收下。<br/>";  
    38.     }  
    39. }  
    40.   
    41. /**代理 
    42.  * Class Proxy 
    43.  */  
    44. class Proxy implements IGiveGift  
    45. {  
    46.     private $follower;  
    47.   
    48.     function __construct($name='Girl')  
    49.     {  
    50.         $this->follower=new Follower($name);  
    51.     }  
    52.   
    53.     function giveRose()  
    54.     {  
    55.         $this->follower->giveRose();  
    56.     }  
    57.   
    58.     function giveChocolate()  
    59.     {  
    60.         $this->follower->giveChocolate();  
    61.     }  
    62. }  


            客户端代码:

            

    1. header("Content-Type:text/html;charset=utf-8");  
    2. //------------------------代理模式测试代码------------------  
    3. require_once "./Proxy/Proxy.php";  
    4. $proxy=new Proxy('范冰冰');  
    5. $proxy->giveRose();  
    6. $proxy->giveChocolate();  


           优点:   

           1、职责清晰

            真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

            2、代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介和保护了目标对象的作用。

            3、高扩展性

           适用场景:

          1) 远程代理(Remote  Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。

            这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
          2) 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。

             如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 
          3) 保护代理(Protection Proxy)控制对原始对象的访问。

               保护代理用于对象应该有不同的访问权限的时候。
          4) 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
          5) Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。

    一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。

    欢迎关注我的视频课程,地址如下,谢谢。

       PHP面向对象设计模式

  • 相关阅读:
    day 03
    day 02
    day 02 作业
    day 01
    day 10 预科
    day 09作业 预科
    day 09 预科
    day 08作业 预科
    The word 'localhost' is not correctly spelled 这个问题怎么解决
    不能够连接到主机(名称为localhost)上的MySQL服务”
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/5576849.html
Copyright © 2011-2022 走看看