PHP设计模式(八)之代理模式

作者: 温新

分类: 【设计模式】

阅读: 2587

时间: 2020-01-24 12:04:31

一、什么是代理模式

**代理模式(Proxy Pattern)**是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网上连接、存储器中的大对象、文件或其它昂贵或无法复制的资源。

例子:

1)生活中有很多实际的案例,比如说“代购”,你想要一个名牌香水,而国内的价格非常高,你想到了你在国外的朋友,因此找他帮你买,然后代回国内,最后交到你手中。

2)由于客人需要5只澳洲大龙虾,餐馆所备用的不够,于是餐馆紧急寻找代理,通过空运的方式以最快的方式送到,餐馆签收澳洲大龙虾即可。

餐馆不需要管代理商是通过怎么的方式去获得澳洲大龙虾的,它只知道,你把大龙虾送到我这里来就行了,就是代理模式,也是本例中所要实现的方式。

二、代理模式结构

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

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

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

三、代理模式优缺点

优点:

1)代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;

2)职责清晰、高扩展性、智能化。

缺点:

1)由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢;

2)实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

四、使用场景

1、远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)。

2、虚拟(Virtual)代理:如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。

3、Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。

4、保护(Protect or Access)代理:控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

5、缓冲(Cache)代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

6、防火墙(Firewall)代理:保护目标不让恶意用户接近。

7、同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

8、智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,如将此对象被调用的次数记录下来等。

五、代码实现

Subject.php

<?php

/**
 * 抽象主题角色----->抽象澳洲大龙虾主题角色
 */
interface Subject
{
    /**
     * 获取澳洲大龙虾
     *
     * @return void
     */
    public function getLobster();
}

RealSubject.php

<?php

/**
 * 真正主题角色----->真正实现获取澳洲大龙虾角色
 */
class RealSubject implements Subject
{
    public function getLobster()
    {
        echo '翻山越海获取到的 5只 澳洲大龙虾~~~';
    }
}

Proxy.php

<?php

/**
 * 代理对象--->经销商,出售澳洲大龙虾
 */
class Proxy implements Subject
{
    protected $obj;

    public function __construct(Subject $obj)
    {
        $this->obj = $obj;
    }

    /**
     * 经销商获取澳洲大龙虾,送货上门
     *
     * @return void
     */
    public function getLobster()
    {
        $this->obj->getLobster();
    }

}

index.php

<?php
require_once './Subject.php';
require_once './Proxy.php';
require_once './RealSubject.php';


$obj = new Proxy(new RealSubject());
$obj->getLobster();

我是夕阳何处寻,期待和优秀的你一起同行!

**今天是除夕。

新的一年里,愿你我的技术不断提高!*

夕阳何处寻

2020年1月24日

请登录后再评论