PHP设计模式(八)之代理模式
一、什么是代理模式
**代理模式(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日