代理模式

代理模式控制着对原对象的访问,并允许在将请求提交给对象前后进行一些处理

代码示例

<?php

interface subject
{
    public function request();
}

//原服务
class realSubject implements subject
{
    public function request()
    {
        echo 'realSubject handle request';
    }
}

class proxy implements subject
{
    //申明成员变量,用来存储引用对象
    private $realSubject;

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

    //将请求提交给原对象前后做一些处理
    public function request()
    {
        if ($this->checkAccess()){
            $this->realSubject->request();
            $this->logAccess();
        }
    }
    
    private function checkAccess()
    {
        echo 'proxy check access';
        
        return true;
    }
    
    private function logAccess()
    {
        echo 'proxy log access';
    }
}

//客户端调用
$realSubject = new realSubject();
$realSubject->request();    // realSubject handle request

$proxy = new proxy($realSubject);
$proxy->request();  //1、proxy check access 2、realSubject handle request 3、proxy log access

从示例中可以明显看出,在将请求交给原对象之前,做了 check 操作,请求完了之后,又做了 log 操作。当然,这只是最简单的应用,围绕这一设计,后续可以做一些更加复杂的场景。

适用场景

- 延迟初始化(虚拟代理):对于一个并不常用并且重量级的服务对象,不必要在程序开始就创建该对象,可以将对象的初始化延迟到真正需要的时候。

- 访问控制(保护代理):对于一些重要的服务对象,在调用之前可以针对性的做一些必要的安全校验。

- 记录日志请求(日志记录代理):代理可以在向服务传递请求前进行日志记录和处理结果的记录。

- 缓存请求结果(缓存代理):将请求结果缓存,避免多次请求。

- 智能引用:没有客户端适用某重量级对象时立即销毁该对象。

posted @ 2020-11-20 11:19  所见即我  阅读(75)  评论(0编辑  收藏  举报