PHP设计模式——代理模式

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

UML类图:


图片.png

角色介绍:

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

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

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

代码实现:

<?php
/**
 * Created by PhpStorm.
 * User: LYL
 * Date: 2015/5/16
 * Time: 16:33
 */
 
/**顶层接口
 * Interface IGiveGift
 */
interface IGiveGift
{
    function giveRose();
    function giveChocolate();
}
 
/**追求者
 * Class Follower
 */
class Follower implements IGiveGift
{
    private $girlName;
 
    function __construct($name='Girl')
    {
        $this->girlName=$name;
    }
 
    function giveRose()
    {
        echo "{$this->girlName}:这是我送你的玫瑰,望你能喜欢。<br/>";
    }
 
    function giveChocolate()
    {
        echo "{$this->girlName}:这是我送你的巧克力,望你能收下。<br/>";
    }
}
 
/**代理
 * Class Proxy
 */
class Proxy implements IGiveGift
{
    private $follower;
 
    function __construct($name='Girl')
    {
        $this->follower=new Follower($name);
    }
 
    function giveRose()
    {
        $this->follower->giveRose();
    }
 
    function giveChocolate()
    {
        $this->follower->giveChocolate();
    }
}

测试代码:

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

优点:

1、职责清晰

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

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

3、高扩展性

适用场景:

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

这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)

  1. 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。

如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。

  1. 保护代理(Protection Proxy)控制对原始对象的访问。

保护代理用于对象应该有不同的访问权限的时候。

  1. 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
  2. Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。

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

参考:
《大话设计模式》,作者程杰
https://blog.csdn.net/jhq0113/article/details/45769989

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容