php设计模式之代理模式
本文内容为转载,原文地址:http://blog.csdn.net/jhq0113/article/details/45769989
代理模式为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
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 <?php 2 header("Content-Type:text/html;charset=utf-8"); 3 //------------------------代理模式测试代码------------------ 4 require_once "./Proxy/Proxy.php"; 5 $proxy=new Proxy('范冰冰'); 6 $proxy->giveRose(); 7 $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代理可以让这个操作延迟,只有对象被用到的时候才被克隆。