Proxy Pattern 代理模式 php

本文通过一个实例展示了如何使用代理模式为商务信息查询系统增加身份验证和日志记录功能。代理模式允许在不修改原有查询模块接口的情况下,实现权限控制和操作记录,实现了功能的松耦合增加,同时也解释了代理模式与适配器模式和装饰器模式的区别。
摘要由CSDN通过智能技术生成

洗心革面,学习设计模式!!

定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

角色:

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 "无权限";
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值