洗心革面,学习设计模式!!
定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
角色:
subject抽象主题角色
proxy代理主题角色
Realsubject真实主题角色
类图:
上代码:
Subject抽象主题角色
interface Subject{
public function request();
}
Proxy代理主题角色
require_once "Subject.php";
require_once "RealSubject.php";
class Proxy implements Subject{
private $realSubject;
function __construct()
{
$this->realSubject = new RealSubject();
}
public function request()
{
$this->realSubject->request();
}
}
realSubject真实主题角色
require_once "Subject.php";
class RealSubject implements Subject{
public function request()
{
echo "realSubject";
}
}
Client客户端类
require_once 'Proxy.php';
$proxy = new Proxy();
$proxy->request();
代理种类:
远程代理:为一个位与不同的地址空间的对象提供一个本地的代理对象。
虚拟代理:如果需要创建一个资源消耗较大的对象,先创建要给消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。
保护代理:控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
Copy-on-Write:是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,cow可以让这个操作延迟,只有对象被用到的时候才被克隆。
缓冲代理:为某一目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
防火墙代理:保护目标不让恶意用户接近。
同步化代理:使几个用户能够同时使用一个对象而没有冲突。
智能引用代理:当一个对象被引用时,提供一些额外的操作。
和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口,代理模式能够让用户通过代理对象享受到比真实对象更多的服务,但不能完全让用户和真实对象解耦。
和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
实例:
某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:
(1) 在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;
(2) 在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。
该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。
现使用代理模式设计并实现该收费商务信息查询系统。
Subject
interface Subject{
public function inquire();
}
Proxy
require_once 'Subject.php';
require_once 'RealSub.php';
class Proxy implements Subject{
private $inquire;
public function __construct()
{
$this->inquire = new RealSub();
}
public function authority($status){
if($status == 1){
return 1;
}else{
return 0;
}
// echo "判断用户权限";
}
public function inquire(){
$this->inquire->inquire();
}
public function log(){
echo "日志记录";
}
}
RealSub
require_once 'Subject.php';
class RealSub implements Subject{
public function inquire()
{
echo "查询模块";
}
}
Client
require_once 'Proxy.php';
$client = new Proxy();
$quthority = $client->authority(1);
if($quthority == 1){
echo "请操作";
$client->inquire();
$client->log();
}else{
echo "无权限";
}